azkaban-aplcache

Changes

docs/ajaxApi.rst 1647(+1647 -0)

docs/index.rst 1(+1 -0)

Details

docs/ajaxApi.rst 1647(+1647 -0)

diff --git a/docs/ajaxApi.rst b/docs/ajaxApi.rst
new file mode 100644
index 0000000..dc23ff7
--- /dev/null
+++ b/docs/ajaxApi.rst
@@ -0,0 +1,1647 @@
+AJAX API
+========
+
+| Often there's a desire to interact with Azkaban without having to use
+  the web UI. Azkaban has some exposed ajax calls accessible through
+  curl or some other HTTP request clients. All API calls require a
+  proper authentication first.
+| Azkaban assumes the following request header in servlet's
+  ``isAjaxCall(HttpServletRequest request)`` method:
+
+::
+
+     Content-Type:     application/x-www-form-urlencoded
+     X-Requested-With: XMLHttpRequest
+
+However, currently for most of APIs in this version, it is not checking
+the request header. Many APIs still treat a request as an ajax call if
+``request`` simply contains the parameter ``ajax``. Or even, several
+APIs is implicitly assuming it is an ajax call even without this
+keyword. For ease of use though, it is recommended to always keep the
+correct request header.
+
+.. _api-authenticate:
+
+Authenticate
+------------
+
+-  **Method:** POST
+-  **Request URL:** /?action=login
+-  **Parameter Location:** Request Query String
+
+This API helps authenticate a user and provides a ``session.id`` in
+response.
+
+Once a ``session.id`` has been returned, until the session expires, this
+id can be used to do any API requests with a proper permission granted.
+A session expires if you log out, change machines, browsers or
+locations, if Azkaban is restarted, or if the session expires. The
+default session timeout is 24 hours (one day). You can re-login whether
+the session has expired or not. For the same user, a new session will
+always override old one.
+
+**Importantly,** ``session.id`` should be provided for almost all API
+calls (other than authentication). ``session.id`` can be simply appended
+as one of the request parameters, or set via the cookie:
+``azkaban.browser.session.id``. The two HTTP requests below are
+equivalent:
+
+.. code-block:: guess
+
+   # a) Provide session.id parameter directly
+   curl -k --get --data "session.id=bca1d75d-6bae-4163-a5b0-378a7d7b5a91&ajax=fetchflowgraph&project=azkaban-test-project&flow=test" https://localhost:8443/manager
+
+   # b) Provide azkaban.browser.session.id cookie
+   curl -k --get -b "azkaban.browser.session.id=bca1d75d-6bae-4163-a5b0-378a7d7b5a91" --data "ajax=fetchflowgraph&project=azkaban-test-project&flow=test" https://localhost:8443/manager
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++--------------+--------------------------------------------------+
+| Parameter    | Description                                      |
++==============+==================================================+
+| action=login | The fixed parameter indicating the login action. |
++--------------+--------------------------------------------------+
+| username     | The Azkaban username.                            |
++--------------+--------------------------------------------------+
+| password     | The corresponding password.                      |
++--------------+--------------------------------------------------+
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++------------+-----------------------------------------------------+
+| Parameter  | Description                                         |
++============+=====================================================+
+| error      | Return an error message if the login attempt fails. |
++------------+-----------------------------------------------------+
+| session.id | Return a session id if the login attempt succeeds.  |
++------------+-----------------------------------------------------+
+
+A sample call via curl:
+
+.. code-block:: guess
+
+   curl -k -X POST --data "action=login&username=azkaban&password=azkaban" https://localhost:8443
+
+A sample response:
+
+.. code-block:: guess
+
+   {
+     "status" : "success",
+     "session.id" : "c001aba5-a90f-4daf-8f11-62330d034c0a"
+   }
+
+.. _api-create-a-project:
+
+Create a Project
+----------------
+
+| The ajax API for creating a new project.
+| **Notice:** before uploading any project zip files, the project should
+  be created first via this API.
+
+-  **Method:** POST
+-  **Request URL:** /manager?action=create
+-  **Parameter Location:** Request Query
+
+.. _request-parameters-1:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| action=create                     | The fixed parameter indicating    |
+|                                   | the create project action.        |
++-----------------------------------+-----------------------------------+
+| name                              | The project name to be uploaded.  |
++-----------------------------------+-----------------------------------+
+| description                       | The description for the project.  |
+|                                   | This field cannot be empty.       |
++-----------------------------------+-----------------------------------+
+
+**Response Object 1. (if the request succeeds):**
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| status                            | The status of the creation        |
+|                                   | attempt.                          |
++-----------------------------------+-----------------------------------+
+| path                              | The url path to redirect          |
++-----------------------------------+-----------------------------------+
+| action                            | The action that is suggested for  |
+|                                   | the frontend to execute. (This is |
+|                                   | designed for the usage of the     |
+|                                   | Azkaban frontend javascripts,     |
+|                                   | external users can ignore this    |
+|                                   | field.)                           |
++-----------------------------------+-----------------------------------+
+
+**Response Object 2. (if the request fails):**
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
++-----------+--------------------+
+| Parameter | Description        |
++===========+====================+
+| message   | The error message. |
++-----------+--------------------+
+| error     | The error name.    |
++-----------+--------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k -X POST --data "session.id=9089beb2-576d-47e3-b040-86dbdc7f523e&name=aaaa&description=11" https://localhost:8443/manager?action=create
+
+A sample response:
+
+.. code-block:: guess
+
+   {
+     "status":"success",
+     "path":"manager?project=aaaa",
+     "action":"redirect"
+   }
+
+.. _api-delete-a-project:
+
+Delete a Project
+----------------
+
+| The ajax API for deleting an existing project.
+| **Notice:** Currently no response message will be returned after
+  finishing the delete operation.
+
+-  **Method:** GET
+-  **Request URL:** /manager?delete=true
+-  **Parameter Location:** Request Query
+
+.. _request-parameters-2:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| delete=true                       | The fixed parameter to indicate   |
+|                                   | the deleting project action.      |
++-----------------------------------+-----------------------------------+
+| project                           | The project name to be deleted.   |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --get --data "session.id=bca1d75d-6bae-4163-a5b0-378a7d7b5a91&delete=true&project=test-delete-project" https://localhost:8443/manager
+
+.. _api-upload-a-project-zip:
+
+Upload a Project Zip
+--------------------
+
+| The ajax call to upload a project zip file. The zip file structure
+  should follows the requirements described in `Upload
+  Projects </docs/2.5/#upload-projects>`__.
+| **Notice:** This API should be called after a project is successfully
+  created.
+
+-  **Method:** POST
+-  **Content-Type:** multipart/mixed
+-  **Request URL:** /manager?ajax=upload
+-  **Parameter Location:** Request Body
+
+.. _request-parameters-3:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=upload                       | The fixed parameter to the upload |
+|                                   | action.                           |
++-----------------------------------+-----------------------------------+
+| project                           | The project name to be uploaded.  |
++-----------------------------------+-----------------------------------+
+| file                              | The project zip file. The type    |
+|                                   | should be set as                  |
+|                                   | ``application/zip`` or            |
+|                                   | ``application/x-zip-compressed``. |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-1:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++-----------+------------------------------------------------+
+| Parameter | Description                                    |
++===========+================================================+
+| error     | The error message if the upload attempt fails. |
++-----------+------------------------------------------------+
+| projectId | The numerical id of the project                |
++-----------+------------------------------------------------+
+| version   | The version number of the upload               |
++-----------+------------------------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k -i -H "Content-Type: multipart/mixed" -X POST --form 'session.id=e7a29776-5783-49d7-afa0-b0e688096b5e' --form 'ajax=upload' --form 'file=@myproject.zip;type=application/zip' --form 'project=MyProject;type/plain' https://localhost:8443/manager
+
+A response sample:
+
+.. code-block:: guess
+
+   {
+     "error" : "Installation Failed.\nError unzipping file.",
+     "projectId" : "192",
+     "version" : "1"
+   }
+
+.. _api-fetch-flows-of-a-project:
+
+Fetch Flows of a Project
+------------------------
+
+Given a project name, this API call fetches all flow ids of that
+project.
+
+-  **Method:** GET
+-  **Request URL:** /manager?ajax=fetchprojectflows
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-4:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=fetchprojectflows            | The fixed parameter indicating    |
+|                                   | the fetchProjectFlows action.     |
++-----------------------------------+-----------------------------------+
+| project                           | The project name to be fetched.   |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-2:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| project                           | The project name.                 |
++-----------------------------------+-----------------------------------+
+| projectId                         | The numerical id of the project.  |
++-----------------------------------+-----------------------------------+
+| flows                             | A list of flow ids.               |
+|                                   | **Example values:** [{"flowId":   |
+|                                   | "aaa"}, {"flowId": "bbb"}]        |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --get --data "session.id=6c96e7d8-4df5-470d-88fe-259392c09eea&ajax=fetchprojectflows&project=azkaban-test-project" https://localhost:8443/manager
+
+A response sample:
+
+.. code-block:: guess
+
+   {
+     "project" : "test-azkaban",
+     "projectId" : 192,
+     "flows" : [ {
+       "flowId" : "test"
+     }, {
+       "flowId" : "test2"
+     } ]
+   }
+
+.. _api-fetch-jobs-of-a-flow:
+
+Fetch Jobs of a Flow
+--------------------
+
+For a given project and a flow id, this API call fetches all the jobs
+that belong to this flow. It also returns the corresponding graph
+structure of those jobs.
+
+-  **Method:** GET
+-  **Request URL:** /manager?ajax=fetchflowgraph
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-5:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=fetchflowgraph               | The fixed parameter indicating    |
+|                                   | the fetchProjectFlows action.     |
++-----------------------------------+-----------------------------------+
+| project                           | The project name to be fetched.   |
++-----------------------------------+-----------------------------------+
+| flow                              | The project id to be fetched.     |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-3:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| project                           | The project name.                 |
++-----------------------------------+-----------------------------------+
+| projectId                         | The numerical id of the project.  |
++-----------------------------------+-----------------------------------+
+| flow                              | The flow id fetched.              |
++-----------------------------------+-----------------------------------+
+| nodes                             | A list of job nodes belonging to  |
+|                                   | this flow.                        |
+|                                   | **Structure:**                    |
+|                                   |                                   |
+|                                   | ::                                |
+|                                   |                                   |
+|                                   |    {                              |
+|                                   |      "id": "job.id"               |
+|                                   |      "type": "job.type"           |
+|                                   |      "in": ["job.ids that this job|
+|                                   |      is directly depending upon.  |
+|                                   |      Indirect ancestors is not in |
+|                                   |      cluded in this list"]        |
+|                                   |    }                              |
+|                                   |                                   |
+|                                   |                                   |
+|                                   | **Example values:** [{"id":       |
+|                                   | "first_job", "type": "java"},     |
+|                                   | {"id": "second_job", "type":      |
+|                                   | "command", "in":["first_job"]}]   |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --get --data "session.id=bca1d75d-6bae-4163-a5b0-378a7d7b5a91&ajax=fetchflowgraph&project=texter-1-1&flow=test" https://localhost:8445/manager
+
+A response sample:
+
+.. code-block:: guess
+
+   {
+     "project" : "azkaban-test-project",
+     "nodes" : [ {
+       "id" : "test-final",
+       "type" : "command",
+       "in" : [ "test-job-3" ]
+     }, {
+       "id" : "test-job-start",
+       "type" : "java"
+     }, {
+       "id" : "test-job-3",
+       "type" : "java",
+       "in" : [ "test-job-2" ]
+     }, {
+       "id" : "test-job-2",
+       "type" : "java",
+       "in" : [ "test-job-start" ]
+     } ],
+     "flow" : "test",
+     "projectId" : 192
+   }
+
+.. _api-fetch-executions-of-a-flow:
+
+Fetch Executions of a Flow
+--------------------------
+
+Given a project name, and a certain flow, this API call provides a list
+of corresponding executions. Those executions are sorted in descendent
+submit time order. Also parameters are expected to specify the start
+index and the length of the list. This is originally used to handle
+pagination.
+
+-  **Method:** GET
+-  **Request URL:** /manager?ajax=fetchFlowExecutions
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-6:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=fetchFlowExecutions          | The fixed parameter indicating    |
+|                                   | the fetchFlowExecutions action.   |
++-----------------------------------+-----------------------------------+
+| project                           | The project name to be fetched.   |
++-----------------------------------+-----------------------------------+
+| flow                              | The flow id to be fetched.        |
++-----------------------------------+-----------------------------------+
+| start                             | The start index(inclusive) of the |
+|                                   | returned list.                    |
++-----------------------------------+-----------------------------------+
+| length                            | The max length of the returned    |
+|                                   | list. For example, if the start   |
+|                                   | index is 2, and the length is 10, |
+|                                   | then the returned list will       |
+|                                   | include executions of indices:    |
+|                                   | [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]. |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-4:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| executions                        | A list of execution objects, with |
+|                                   | the resquested start index and    |
+|                                   | length.                           |
++-----------------------------------+-----------------------------------+
+| total                             | The total number of all relevant  |
+|                                   | execution                         |
++-----------------------------------+-----------------------------------+
+| project                           | The project name fetched.         |
++-----------------------------------+-----------------------------------+
+| projectId                         | The numerical project id fetched. |
++-----------------------------------+-----------------------------------+
+| flow                              | The flow id fetched.              |
++-----------------------------------+-----------------------------------+
+| from                              | The start index of the fetched    |
+|                                   | executions                        |
++-----------------------------------+-----------------------------------+
+| length                            | The length of the fetched         |
+|                                   | executions.                       |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --get --data "session.id=6c96e7d8-4df5-470d-88fe-259392c09eea&ajax=fetchFlowExecutions&project=azkaban-test-project&flow=test&start=0&length=3" https://localhost:8443/manager
+
+A response sample:
+
+.. code-block:: guess
+
+   {
+     "executions" : [ {
+       "startTime" : 1407779928865,
+       "submitUser" : "1",
+       "status" : "FAILED",
+       "submitTime" : 1407779928829,
+       "execId" : 306,
+       "projectId" : 192,
+       "endTime" : 1407779950602,
+       "flowId" : "test"
+     }, {
+       "startTime" : 1407779877807,
+       "submitUser" : "1",
+       "status" : "FAILED",
+       "submitTime" : 1407779877779,
+       "execId" : 305,
+       "projectId" : 192,
+       "endTime" : 1407779899599,
+       "flowId" : "test"
+     }, {
+       "startTime" : 1407779473354,
+       "submitUser" : "1",
+       "status" : "FAILED",
+       "submitTime" : 1407779473318,
+       "execId" : 304,
+       "projectId" : 192,
+       "endTime" : 1407779495093,
+       "flowId" : "test"
+     } ],
+     "total" : 16,
+     "project" : "azkaban-test-project",
+     "length" : 3,
+     "from" : 0,
+     "flow" : "test",
+     "projectId" : 192
+   }
+
+.. _api-fetch-running-executions-of-a-flow:
+
+Fetch Running Executions of a Flow
+----------------------------------
+
+Given a project name and a flow id, this API call fetches only
+executions that are currently running.
+
+-  **Method:** GET
+-  **Request URL:** /executor?ajax=getRunning
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-7:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=getRunning                   | The fixed parameter indicating    |
+|                                   | the getRunning action.            |
++-----------------------------------+-----------------------------------+
+| project                           | The project name to be fetched.   |
++-----------------------------------+-----------------------------------+
+| flow                              | The flow id to be fetched.        |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-5:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| execIds                           | A list of execution ids fetched.  |
+|                                   | **Example values:** [301, 302,    |
+|                                   | 111, 999]                         |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --data "session.id=34ba08fd-5cfa-4b65-94c4-9117aee48dda&ajax=getRunning&project=azkaban-test-project&flow=test" https://localhost:8443/executor
+
+A response sample:
+
+.. code-block:: guess
+
+   {
+     "execIds": [301, 302]
+   }
+
+.. _api-execute-a-flow:
+
+Execute a Flow
+--------------
+
+This API executes a flow via an ajax call, supporting a rich selection
+of different options. Running an individual job can also be achieved via
+this API by disabling all other jobs in the same flow.
+
+-  **Method:** GET
+-  **Request URL:** /executor?ajax=executeFlow
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-8:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
+|                                   |                                   |
+|                                   | **Example Values:**               |
+|                                   | 30d538e2-4794-4e7e-8a35-25a9e2fd5 |
+|                                   | 300                               |
++-----------------------------------+-----------------------------------+
+| ajax=executeFlow                  | The fixed parameter indicating    |
+|                                   | the current ajax action is        |
+|                                   | executeFlow.                      |
++-----------------------------------+-----------------------------------+
+| project                           | The project name of the executing |
+|                                   | flow.                             |
+|                                   |                                   |
+|                                   | **Example Values:** run-all-jobs  |
++-----------------------------------+-----------------------------------+
+| flow                              | The flow id to be executed.       |
+|                                   |                                   |
+|                                   | **Example Values:** test-flow     |
++-----------------------------------+-----------------------------------+
+| disabled (optional)               | A list of job names that should   |
+|                                   | be disabled for this execution.   |
+|                                   | Should be formatted as a JSON     |
+|                                   | Array String.                     |
+|                                   |                                   |
+|                                   | **Example Values:**               |
+|                                   | ["job_name_1", "job_name_2",      |
+|                                   | "job_name_N"]                     |
++-----------------------------------+-----------------------------------+
+| successEmails (optional)          | A list of emails to be notified   |
+|                                   | if the execution succeeds. All    |
+|                                   | emails are delimitted with        |
+|                                   | [,|;|\\s+].                       |
+|                                   |                                   |
+|                                   | **Example Values:**               |
+|                                   | foo@email.com,bar@email.com       |
++-----------------------------------+-----------------------------------+
+| failureEmails (optional)          | A list of emails to be notified   |
+|                                   | if the execution fails. All       |
+|                                   | emails are delimitted with        |
+|                                   | [,|;|\\s+].                       |
+|                                   |                                   |
+|                                   | **Example Values:**               |
+|                                   | foo@email.com,bar@email.com       |
++-----------------------------------+-----------------------------------+
+| successEmailsOverride (optional)  | Whether uses system default email |
+|                                   | settings to override              |
+|                                   | successEmails.                    |
+|                                   |                                   |
+|                                   | **Possible Values:** true, false  |
++-----------------------------------+-----------------------------------+
+| failureEmailsOverride (optional)  | Whether uses system default email |
+|                                   | settings to override              |
+|                                   | failureEmails.                    |
+|                                   |                                   |
+|                                   | **Possible Values:** true, false  |
++-----------------------------------+-----------------------------------+
+| notifyFailureFirst (optional)     | Whether sends out email           |
+|                                   | notifications as long as the      |
+|                                   | first failure occurs.             |
+|                                   |                                   |
+|                                   | **Possible Values:** true, false  |
++-----------------------------------+-----------------------------------+
+| notifyFailureLast (optional)      | Whether sends out email           |
+|                                   | notifications as long as the last |
+|                                   | failure occurs.                   |
+|                                   |                                   |
+|                                   | **Possible Values:** true, false  |
++-----------------------------------+-----------------------------------+
+| failureAction (Optional)          | If a failure occurs, how should   |
+|                                   | the execution behaves.            |
+|                                   |                                   |
+|                                   | **Possible Values:**              |
+|                                   | finishCurrent, cancelImmediately, |
+|                                   | finishPossible                    |
++-----------------------------------+-----------------------------------+
+| concurrentOption (Optional)       | Concurrent choices. Use ignore if |
+|                                   | nothing specifical is required.   |
+|                                   |                                   |
+|                                   | **Possible Values:** ignore,      |
+|                                   | pipeline, skip                    |
++-----------------------------------+-----------------------------------+
+| flowOverride[flowProperty]        | Override specified flow property  |
+| (Optional)                        | with specified value.             |
+|                                   |                                   |
+|                                   | **Example Values :**              |
+|                                   | flowOverride[failure.email]=test@ |
+|                                   | gmail.com                         |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-6:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++-----------+--------------------------------------+
+| Parameter | Description                          |
++===========+======================================+
+| error     | Error message if the call has failed |
++-----------+--------------------------------------+
+| flow      | The executed flow id                 |
++-----------+--------------------------------------+
+| execid    | The execution id                     |
++-----------+--------------------------------------+
+
+Here is a curl command example:
+
+.. code-block:: guess
+
+   curl -k --get --data 'session.id=189b956b-f39f-421e-9a95-e3117e7543c9' --data 'ajax=executeFlow' --data 'project=azkaban-test-project' --data 'flow=test' https://localhost:8443/executor
+
+Sample response:
+
+.. code-block:: guess
+
+   {
+     message: "Execution submitted successfully with exec id 295",
+     project: "foo-demo",
+     flow: "test",
+     execid: 295
+   }
+
+.. _api-cancel-a-flow-execution:
+
+Cancel a Flow Execution
+-----------------------
+
+Given an execution id, this API call cancels a running flow. If the flow
+is not running, it will return an error message.
+
+-  **Method:** GET
+-  **Request URL:** /executor?ajax=cancelFlow
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-9:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=cancelFlow                   | The fixed parameter indicating    |
+|                                   | the current ajax action is        |
+|                                   | cancelFlow.                       |
++-----------------------------------+-----------------------------------+
+| execid                            | The execution id.                 |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --data "session.id=34ba08fd-5cfa-4b65-94c4-9117aee48dda&ajax=cancelFlow&execid=302" https://localhost:8443/executor
+
+A response sample if succeeds:
+
+.. code-block:: guess
+
+   { }
+
+A response sample if fails:
+
+.. code-block:: guess
+
+   {
+     "error" : "Execution 302 of flow test isn't running."
+   }
+
+.. _api-schedule-a-flow:
+
+Schedule a period-based Flow (Deprecated)
+-----------------------------------------
+
+This API call schedules a period-based flow.
+
+-  **Method:** POST
+-  **Request URL:** /schedule?ajax=scheduleFlow
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-10:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=scheduleFlow                 | The fixed parameter indicating    |
+|                                   | the action is to schedule a flow. |
++-----------------------------------+-----------------------------------+
+| projectName                       | The name of the project.          |
++-----------------------------------+-----------------------------------+
+| projectId                         | The id of the project. You can    |
+|                                   | find this with `Fetch Flows of a  |
+|                                   | Project <#api-fetch-flows-of-a-pr |
+|                                   | oject>`__.                        |
++-----------------------------------+-----------------------------------+
+| flowName                          | The name of the flow.             |
++-----------------------------------+-----------------------------------+
+| scheduleTime(with timezone)       | The time to schedule the flow.    |
+|                                   | Example: 12,00,pm,PDT (Unless UTC |
+|                                   | is specified, Azkaban will take   |
+|                                   | current server's default timezone |
+|                                   | instead)                          |
++-----------------------------------+-----------------------------------+
+| scheduleDate                      | The date to schedule the flow.    |
+|                                   | Example: 07/22/2014               |
++-----------------------------------+-----------------------------------+
+| is_recurring=on (optional)        | Flags the schedule as a recurring |
+|                                   | schedule.                         |
++-----------------------------------+-----------------------------------+
+| period (optional)                 | Specifies the recursion period.   |
+|                                   | Depends on the "is_recurring"     |
+|                                   | flag being set. Example: 5w       |
+|                                   | **Possible Values:**              |
+|                                   |                                   |
+|                                   | +---+---------+                   |
+|                                   | | M | Months  |                   |
+|                                   | +---+---------+                   |
+|                                   | | w | Weeks   |                   |
+|                                   | +---+---------+                   |
+|                                   | | d | Days    |                   |
+|                                   | +---+---------+                   |
+|                                   | | h | Hours   |                   |
+|                                   | +---+---------+                   |
+|                                   | | m | Minutes |                   |
+|                                   | +---+---------+                   |
+|                                   | | s | Seconds |                   |
+|                                   | +---+---------+                   |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+
+     # a) One time schedule
+     curl -k https://HOST:PORT/schedule -d "ajax=scheduleFlow&projectName=PROJECT_NAME&flow=FLOW_NAME&projectId=PROJECT_ID&scheduleTime=12,00,pm,PDT&scheduleDate=07/22/2014" -b azkaban.browser.session.id=SESSION_ID
+
+     # b) Recurring schedule
+     curl -k https://HOST:PORT/schedule -d "ajax=scheduleFlow&is_recurring=on&period=5w&projectName=PROJECT_NAME&flow=FLOW_NAME&projectId=PROJECT_ID&scheduleTime=12,00,pm,PDT&scheduleDate=07/22/2014" -b azkaban.browser.session.id=SESSION_ID
+
+An example success response:
+
+.. code-block:: guess
+
+   {
+     "message" : "PROJECT_NAME.FLOW_NAME scheduled.",
+     "status" : "success"
+   }
+
+An example failure response:
+
+.. code-block:: guess
+
+   {
+     "message" : "Permission denied. Cannot execute FLOW_NAME",
+     "status" : "error"
+   }
+
+An example failure response for invalid schedule period:
+
+.. code-block:: guess
+
+   {
+     "message" : "PROJECT_NAME.FLOW_NAME scheduled.",
+     "error" : "Invalid schedule period unit 'A",
+     "status" : "success"
+   }
+
+.. _api-flexible-schedule:
+
+Flexible scheduling using Cron
+------------------------------
+
+This API call schedules a flow by a cron Expression. Cron is a UNIX tool
+that has been widely used for a long time, and we use `Quartz
+library <http://www.quartz-scheduler.org/>`__ to parse cron Expression.
+All cron schedules follow the timezone defined in azkaban web server
+(the timezone ID is obtained by
+*java.util.TimeZone.getDefault().getID()*).
+
+-  **Method:** POST
+-  **Request URL:** /schedule?ajax=scheduleCronFlow
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-11:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=scheduleCronFlow             | The fixed parameter indicating    |
+|                                   | the action is to use cron to      |
+|                                   | schedule a flow.                  |
++-----------------------------------+-----------------------------------+
+| projectName                       | The name of the project.          |
++-----------------------------------+-----------------------------------+
+| flow                              | The name of the flow.             |
++-----------------------------------+-----------------------------------+
+| cronExpression                    | A CRON expression is a string     |
+|                                   | comprising 6 or 7 fields          |
+|                                   | separated by white space that     |
+|                                   | represents a set of times. In     |
+|                                   | azkaban, we use `Quartz Cron      |
+|                                   | Format <http://www.quartz-schedul |
+|                                   | er.org/documentation/quartz-2.x/t |
+|                                   | utorials/crontrigger.html>`__.    |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k -d ajax=scheduleCronFlow -d projectName=wtwt -d flow=azkaban-training --data-urlencode cronExpression="0 23/30 5,7-10 ? * 6#3" -b "azkaban.browser.session.id=XXXXXXXXXXXXXX" http://localhost:8081/schedule
+
+An example success response:
+
+.. code-block:: guess
+
+   {
+     "message" : "PROJECT_NAME.FLOW_NAME scheduled.",
+     "scheduleId" : SCHEDULE_ID,
+     "status" : "success"
+   }
+
+An example failure response:
+
+.. code-block:: guess
+
+   {
+     "message" : "Cron expression must exist.",
+     "status" : "error"
+   }
+
+.. code-block:: guess
+
+   {
+     "message" : "Permission denied. Cannot execute FLOW_NAME",
+     "status" : "error"
+   }
+
+An example failure response for invalid cron expression:
+
+.. code-block:: guess
+
+   {
+     "message" : "This expression <*****> can not be parsed to quartz cron.",
+     "status" : "error"
+   }
+
+.. _api-fetch-schedule:
+
+Fetch a Schedule
+----------------
+
+Given a project id and a flow id, this API call fetches the schedule.
+
+-  **Method:** GET
+-  **Request URL:** /schedule?ajax=fetchSchedule
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-12:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++--------------------+----------------------------------------------+
+| Parameter          | Description                                  |
++====================+==============================================+
+| session.id         | The user session id.                         |
++--------------------+----------------------------------------------+
+| ajax=fetchSchedule | The fixed parameter indicating the schedule. |
++--------------------+----------------------------------------------+
+| projectId          | The id of the project.                       |
++--------------------+----------------------------------------------+
+| flowId             | The name of the flow.                        |
++--------------------+----------------------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --get --data "session.id=XXXXXXXXXXXXXX&ajax=fetchSchedule&projectId=1&flowId=test" http://localhost:8081/schedule
+
+An example success response:
+
+.. code-block:: guess
+
+   {
+     "schedule" : {
+       "cronExpression" : "0 * 9 ? * *",
+       "nextExecTime" : "2017-04-01 09:00:00",
+       "period" : "null",
+       "submitUser" : "azkaban",
+       "executionOptions" : {
+         "notifyOnFirstFailure" : false,
+         "notifyOnLastFailure" : false,
+         "failureEmails" : [ ],
+         "successEmails" : [ ],
+         "pipelineLevel" : null,
+         "queueLevel" : 0,
+         "concurrentOption" : "skip",
+         "mailCreator" : "default",
+         "memoryCheck" : true,
+         "flowParameters" : {
+         },
+         "failureAction" : "FINISH_CURRENTLY_RUNNING",
+         "failureEmailsOverridden" : false,
+         "successEmailsOverridden" : false,
+         "pipelineExecutionId" : null,
+         "disabledJobs" : [ ]
+       },
+       "scheduleId" : "3",
+       "firstSchedTime" : "2017-03-31 11:45:21"
+     }
+   }
+
+If there is no schedule, empty response returns.
+
+.. code-block:: guess
+
+   {}
+
+.. _api-unschedule-a-flow:
+
+Unschedule a Flow
+-----------------
+
+This API call unschedules a flow.
+
+-  **Method:** POST
+-  **Request URL:** /schedule?action=removeSched
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-13:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| action=removeSched                | The fixed parameter indicating    |
+|                                   | the action is to unschedule a     |
+|                                   | flow.                             |
++-----------------------------------+-----------------------------------+
+| scheduleId                        | The id of the schedule. You can   |
+|                                   | find this in the Azkaban UI on    |
+|                                   | the /schedule page.               |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k https://HOST:PORT/schedule -d "action=removeSched&scheduleId=SCHEDULE_ID" -b azkaban.browser.session.id=SESSION_ID
+
+An example success response:
+
+.. code-block:: guess
+
+   {
+     "message" : "flow FLOW_NAME removed from Schedules.",
+     "status" : "success"
+   }
+
+An example failure response:
+
+.. code-block:: guess
+
+   {
+     "message" : "Schedule with ID SCHEDULE_ID does not exist",
+     "status" : "error"
+   }
+
+.. _api-set-sla:
+
+Set a SLA
+---------
+
+This API call sets a SLA.
+
+-  **Method:** POST
+-  **Request URL:** /schedule?ajax=setSla
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-14:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=setSla                       | The fixed parameter indicating    |
+|                                   | the action is to set a SLA.       |
++-----------------------------------+-----------------------------------+
+| scheduleId                        | The id of the shchedule. You can  |
+|                                   | find this with `Fetch a           |
+|                                   | Schedule <#api-fetch-schedule>`__ |
+|                                   | .                                 |
++-----------------------------------+-----------------------------------+
+| slaEmails                         | A list of SLA alert emails.       |
+|                                   | **Example:**                      |
+|                                   | slaEmails=a@example.com;b@example |
+|                                   | .com                              |
++-----------------------------------+-----------------------------------+
+| settings[...]                     | Rules of SLA. Format is           |
+|                                   | settings[...]=[id],[rule],[durati |
+|                                   | on],[emailAction],[killAction].   |
+|                                   | **Example:**                      |
+|                                   | settings[0]=aaa,SUCCESS,5:00,true |
+|                                   | ,false                            |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k -d "ajax=setSla&scheduleId=1&slaEmails=a@example.com;b@example.com&settings[0]=aaa,SUCCESS,5:00,true,false&settings[1]=bbb,SUCCESS,10:00,false,true" -b "azkaban.browser.session.id=XXXXXXXXXXXXXX" "http://localhost:8081/schedule"
+
+An example success response:
+
+.. code-block:: guess
+
+   {}
+
+An example failure response:
+
+.. code-block:: guess
+
+   {
+     "error" : "azkaban.scheduler.ScheduleManagerException: Unable to parse duration for a SLA that needs to take actions!"
+   }
+
+.. _api-fetch-sla:
+
+Fetch a SLA
+-----------
+
+Given a schedule id, this API call fetches the SLA.
+
+-  **Method:** GET
+-  **Request URL:** /schedule?ajax=slaInfo
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-15:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=slaInfo                      | The fixed parameter indicating    |
+|                                   | the SLA.                          |
++-----------------------------------+-----------------------------------+
+| scheduleId                        | The id of the shchedule. You can  |
+|                                   | find this with `Fetch a           |
+|                                   | Schedule <#api-fetch-schedule>`__ |
+|                                   | .                                 |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --get --data "session.id=XXXXXXXXXXXXXX&ajax=slaInfo&scheduleId=1" http://localhost:8081/schedule"
+
+An example success response:
+
+.. code-block:: guess
+
+   {
+     "settings" : [ {
+       "duration" : "300m",
+       "rule" : "SUCCESS",
+       "id" : "aaa",
+       "actions" : [ "EMAIL" ]
+     }, {
+       "duration" : "600m",
+       "rule" : "SUCCESS",
+       "id" : "bbb",
+       "actions" : [ "KILL" ]
+     } ],
+     "slaEmails" : [ "a@example.com", "b@example.com" ],
+     "allJobNames" : [ "aaa", "ccc", "bbb", "start", "end" ]
+   }
+
+.. _api-pause-a-flow-execution:
+
+Pause a Flow Execution
+----------------------
+
+Given an execution id, this API pauses a running flow. If an execution
+has already been paused, it will not return any error; if an execution
+is not running, it will return an error message.
+
+-  **Method:** GET
+-  **Request URL:** /executor?ajax=pauseFlow
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-16:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=pauseFlow                    | The fixed parameter indicating    |
+|                                   | the current ajax action is        |
+|                                   | pauseFlow.                        |
++-----------------------------------+-----------------------------------+
+| execid                            | The execution id.                 |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --data "session.id=34ba08fd-5cfa-4b65-94c4-9117aee48dda&ajax=pauseFlow&execid=303" https://localhost:8443/executor
+
+A response sample (if succeeds, or pauseFlow is called multiple times):
+
+.. code-block:: guess
+
+   { }
+
+A response sample (if fails, only when the flow is not actually
+running):
+
+.. code-block:: guess
+
+   {
+     "error" : "Execution 303 of flow test isn't running."
+   }
+
+.. _api-resume-a-flow-execution:
+
+Resume a Flow Execution
+-----------------------
+
+Given an execution id, this API resumes a paused running flow. If an
+execution has already been resumed, it will not return any errors; if an
+execution is not runnning, it will return an error message.
+
+-  **Method:** GET
+-  **Request URL:** /executor?ajax=resumeFlow
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-17:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=resumeFlow                   | The fixed parameter indicating    |
+|                                   | the current ajax action is        |
+|                                   | resumeFlow.                       |
++-----------------------------------+-----------------------------------+
+| execid                            | The execution id.                 |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --data "session.id=34ba08fd-5cfa-4b65-94c4-9117aee48dda&ajax=resumeFlow&execid=303" https://localhost:8443/executor
+
+A response sample (if succeeds, or resumeFlow is called multiple times):
+
+.. code-block:: guess
+
+   { }
+
+A response sample (if fails, only when the flow is not actually
+running):
+
+.. code-block:: guess
+
+   {
+     "error" : "Execution 303 of flow test isn't running."
+   }
+
+.. _api-fetch-a-flow-execution:
+
+Fetch a Flow Execution
+----------------------
+
+Given an execution id, this API call fetches all the detailed
+information of that execution, including a list of all the job
+executions.
+
+-  **Method:** GET
+-  **Request URL:** /executor?ajax=fetchexecflow
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-18:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=fetchexecflow                | The fixed parameter indicating    |
+|                                   | the fetchexecflow action.         |
++-----------------------------------+-----------------------------------+
+| execid                            | The execution id to be fetched.   |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-7:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
+It returns a detailed information about the execution (check the example
+below). One thing to notice is that the field ``nodes[i].in`` actually
+indicates what are the dependencies of this node.
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --data "session.id=34ba08fd-5cfa-4b65-94c4-9117aee48dda&ajax=fetchexecflow&execid=304" https://localhost:8443/executor
+
+A response sample:
+
+.. code-block:: guess
+
+   {
+     "attempt" : 0,
+     "submitUser" : "1",
+     "updateTime" : 1407779495095,
+     "status" : "FAILED",
+     "submitTime" : 1407779473318,
+     "projectId" : 192,
+     "flow" : "test",
+     "endTime" : 1407779495093,
+     "type" : null,
+     "nestedId" : "test",
+     "startTime" : 1407779473354,
+     "id" : "test",
+     "project" : "test-azkaban",
+     "nodes" : [ {
+       "attempt" : 0,
+       "startTime" : 1407779495077,
+       "id" : "test",
+       "updateTime" : 1407779495077,
+       "status" : "CANCELLED",
+       "nestedId" : "test",
+       "type" : "command",
+       "endTime" : 1407779495077,
+       "in" : [ "test-foo" ]
+     }, {
+       "attempt" : 0,
+       "startTime" : 1407779473357,
+       "id" : "test-bar",
+       "updateTime" : 1407779484241,
+       "status" : "SUCCEEDED",
+       "nestedId" : "test-bar",
+       "type" : "pig",
+       "endTime" : 1407779484236
+     }, {
+       "attempt" : 0,
+       "startTime" : 1407779484240,
+       "id" : "test-foobar",
+       "updateTime" : 1407779495073,
+       "status" : "FAILED",
+       "nestedId" : "test-foobar",
+       "type" : "java",
+       "endTime" : 1407779495068,
+       "in" : [ "test-bar" ]
+     }, {
+       "attempt" : 0,
+       "startTime" : 1407779495069,
+       "id" : "test-foo",
+       "updateTime" : 1407779495069,
+       "status" : "CANCELLED",
+       "nestedId" : "test-foo",
+       "type" : "java",
+       "endTime" : 1407779495069,
+       "in" : [ "test-foobar" ]
+     } ],
+     "flowId" : "test",
+     "execid" : 304
+   }
+
+.. _api-fetch-execution-job-logs:
+
+Fetch Execution Job Logs
+------------------------
+
+Given an execution id and a job id, this API call fetches the
+correponding job logs. The log text can be quite large sometimes, so
+this API call also expects the parameters ``offset`` and ``length`` to
+be specified.
+
+-  **Method:** GET
+-  **Request URL:** /executor?ajax=fetchExecJobLogs
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-19:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=fetchExecJobLogs             | The fixed parameter indicating    |
+|                                   | the fetchExecJobLogs action.      |
++-----------------------------------+-----------------------------------+
+| execid                            | The unique id for an execution.   |
++-----------------------------------+-----------------------------------+
+| jobId                             | The unique id for the job to be   |
+|                                   | fetched.                          |
++-----------------------------------+-----------------------------------+
+| offset                            | The offset for the log data.      |
++-----------------------------------+-----------------------------------+
+| length                            | The length of the log data. For   |
+|                                   | example, if the offset set is 10  |
+|                                   | and the length is 1000, the       |
+|                                   | returned log will starts from the |
+|                                   | 10th character and has a length   |
+|                                   | of 1000 (less if the remaining    |
+|                                   | log is less than 1000 long).      |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-8:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++-----------+------------------------------+
+| Parameter | Description                  |
++===========+==============================+
+| data      | The text data of the logs.   |
++-----------+------------------------------+
+| offset    | The offset for the log data. |
++-----------+------------------------------+
+| length    | The length of the log data.  |
++-----------+------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --data "session.id=9089beb2-576d-47e3-b040-86dbdc7f523e&ajax=fetchExecJobLogs&execid=297&jobId=test-foobar&offset=0&length=100" https://localhost:8443/executor
+
+A response sample:
+
+.. code-block:: guess
+
+   {
+     "data" : "05-08-2014 16:53:02 PDT test-foobar INFO - Starting job test-foobar at 140728278",
+     "length" : 100,
+     "offset" : 0
+   }
+
+.. _api-fetch-flow-execution-updates:
+
+Fetch Flow Execution Updates
+----------------------------
+
+This API call fetches the updated information for an execution. It
+filters by ``lastUpdateTime`` which only returns job information updated
+afterwards.
+
+-  **Method:** GET
+-  **Request URL:** /executor?ajax=fetchexecflowupdate
+-  **Parameter Location:** Request Query String
+
+.. _request-parameters-20:
+
+**Request Parameters**
+~~~~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| session.id                        | The user session id.              |
++-----------------------------------+-----------------------------------+
+| ajax=fetchexecflowupdate          | The fixed parameter indicating    |
+|                                   | the fetch execution updates       |
+|                                   | action.                           |
++-----------------------------------+-----------------------------------+
+| execid                            | The execution id.                 |
++-----------------------------------+-----------------------------------+
+| lastUpdateTime                    | The criteria to filter by last    |
+|                                   | update time. Set the value to be  |
+|                                   | ``-1`` if all job information are |
+|                                   | needed.                           |
++-----------------------------------+-----------------------------------+
+
+.. _response-object-9:
+
+**Response Object**
+~~~~~~~~~~~~~~~~~~~
+
++-----------------------------------+-----------------------------------+
+| Parameter                         | Description                       |
++===================================+===================================+
+| id                                | The flow id.                      |
++-----------------------------------+-----------------------------------+
+| flow                              | The flow name.                    |
++-----------------------------------+-----------------------------------+
+| startTime                         | The start time of this flow       |
+|                                   | execution.                        |
++-----------------------------------+-----------------------------------+
+| updateTime                        | The last updated time of this     |
+|                                   | flow execution.                   |
++-----------------------------------+-----------------------------------+
+| endTime                           | The end time of this flow         |
+|                                   | execution (if it finishes).       |
++-----------------------------------+-----------------------------------+
+| status                            | The current status of the flow.   |
++-----------------------------------+-----------------------------------+
+| attempt                           | The attempt number of this flow   |
+|                                   | execution.                        |
++-----------------------------------+-----------------------------------+
+| nodes                             | Information for each execution    |
+|                                   | job. Containing the following     |
+|                                   | fields:                           |
+|                                   | ::                                |
+|                                   |                                   |
+|                                   |    {                              |
+|                                   |      "attempt": String,           |
+|                                   |      "startTime": Number,         |
+|                                   |      "id": String (the job id),   |
+|                                   |      "updateTime":Number,         |
+|                                   |      "status": String,            |
+|                                   |      "endTime": Number            |
+|                                   |    }                              |
+|                                   |                                   |
++-----------------------------------+-----------------------------------+
+
+Here's a curl command sample:
+
+.. code-block:: guess
+
+   curl -k --data "execid=301&lastUpdateTime=-1&session.id=6668c180-efe7-46a-8dd2-e36508b440d8" https://localhost:8443/executor?ajax=fetchexecflowupdate
+
+A response sample:
+
+.. code-block:: guess
+
+   {
+     "id" : "test",
+     "startTime" : 1407778382894,
+     "attempt" : 0,
+     "status" : "FAILED",
+     "updateTime" : 1407778404708,
+     "nodes" : [ {
+       "attempt" : 0,
+       "startTime" : 1407778404683,
+       "id" : "test",
+       "updateTime" : 1407778404683,
+       "status" : "CANCELLED",
+       "endTime" : 1407778404683
+     }, {
+       "attempt" : 0,
+       "startTime" : 1407778382913,
+       "id" : "test-job-1",
+       "updateTime" : 1407778393850,
+       "status" : "SUCCEEDED",
+       "endTime" : 1407778393845
+     }, {
+       "attempt" : 0,
+       "startTime" : 1407778393849,
+       "id" : "test-job-2",
+       "updateTime" : 1407778404679,
+       "status" : "FAILED",
+       "endTime" : 1407778404675
+     }, {
+       "attempt" : 0,
+       "startTime" : 1407778404675,
+       "id" : "test-job-3",
+       "updateTime" : 1407778404675,
+       "status" : "CANCELLED",
+       "endTime" : 1407778404675
+     } ],
+     "flow" : "test",
+     "endTime" : 1407778404705
+   }

docs/index.rst 1(+1 -0)

diff --git a/docs/index.rst b/docs/index.rst
index a90632c..51d65e9 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -35,6 +35,7 @@ Features
    configuration
    useAzkaban
    eventTrigger
+   ajaxApi