shipyard/docs/API.md

337 lines
11 KiB
Markdown

# Shipyard API
Logically, the API has three parts to handle the three areas of functionality
in Shipyard.
1. Document Staging
2. Action Handling
3. Airflow Monitoring
## Standards used by the API
See [UCP API conventions](https://github.com/att-comdev/ucp-integration/blob/master/docs/api-conventions.md)
---
## <a name="DocumentStagingAPI"></a> Document Staging API
>Shipyard will serve as the entrypoint for documents (designs, secrets,
configurations, etc...) into a site. Documents are posted to Shipyard in
collections, rather than individually. At any point in time, there will be two
represented versions of documents in a site that are accessible via this API:
>
>* The "Committed Documents" version, which represents the last version of
documents that were successfully commited with a commit_configdocs action.
>* The "Shipyard Buffer" version, which represents the collection of documents
that have been ingested by this API since the last commited version. Note that
only one set of documents maybe posted to the buffer at a time by default.
(This behavior can be overridden by query parameters issued by the user of
Shipyard)
>
> All versions of documents rely upon Deckhand for storage. Shipyard uses the
tagging features of Deckhand of to find the appropriate Committed Documents
and Shipyard Buffer version.
---
### /v1.0/configdocs/{collection_id}
Represents the site configuration documents
#### Payload Structure
The documents as noted above (commonly yaml), in a format understood by
Deckhand
#### POST
Ingests a collection of documents. Synchronous. POSTing an empty body
indicates that the specified collection should be deleted when the Shipyard
Buffer is committed. If a POST to the commitconfigdocs is in progress, this
POST should be rejected with a 409 error.
##### Query Parameters
* bufferMode=append|replace|**rejectOnContents**
Indicates how the existing Shipyard Buffer should be handled. By default,
Shipyard will reject the POST if contents already exist in the Shipyard
Buffer.
* append: Add the collection to the Shipyard Buffer, only if that
collection doesn't already exist in the Shipyard Buffer. If the collection
is already present, the request will be rejected and a 409 Conflict will be
returned.
* replace: Clear the Shipyard Buffer before adding the specified collection.
##### Responses
* 201 Created
If the documents are successfully ingested, even with validation failures.
Response message includes:
* a list of validation results
* The response headers will include a Location indicating the GET endpoint
to retrieve the configDocs
* 409 Conflict
* If a commitconfigdocs POST is in progress.
* If any collections exist in the Shipyard Buffer unless bufferMode=replace
or bufferMode=append.
* If bufferMode=append, and the collection being posted is already in the
Shipyard Buffer
#### GET
Returns the source documents for a collection of documents
##### Query Parameters
* version=committed|**buffer**
Return the documents for the version specified - buffer by default.
##### Responses
* 200 OK
If documents can be retrieved.
* If the response is 200 with an empty response body, this indicates that
the buffer version is attempting to 'delete' the collection when it is
committed. An empty response body will only be possible for version=buffer.
* 404 Not Found
If the collection is not represented
* When version=buffer, this indicates that no representations of this
collection have been POSTed since the last committed version.
* When version=committed, this indicates that either the collection has
never existed or has been deleted by a prior commit
---
### /v1.0/renderedconfigdocs
Represents the site configuration documents, as a whole set - does not
consider collections in any way.
#### GET
Returns the full set of configdocs in their rendered form.
##### Query Parameters
* version=committed|**buffer**
Return the documents for the version specified - buffer by default.
##### Responses
* 200 OK
If documents can be retrieved.
---
### /v1.0/commitconfigdocs
A RPC style command to trigger a commit of the configuration documents from the
Shipyard Buffer to the Committed Documents. This resource will support POST
only.
#### Payload Structure
The response will be the list of validations from all downstream systems that
perform validation during the commit process. The structure will match the
error response object described in the [UCP API conventions](https://github.com/att-comdev/ucp-integration/blob/master/docs/api-conventions.md)
and will be an aggregation of each UCP component's responses.
#### POST
Performs the commit of the Shipyard Buffer to the Committed Documents.
Synchronous. This invokes each of the UCP components to examine the Shipyard
Buffer version of the configuration documents and aggregate the responses.
While performing this commit, further POSTing of configdocs, or other commits
may not be invoked (Shipyard will block those requests with a 409 response).
If there are any failures to validate, the Shipyard Buffer and Commited
Documents will remain unchanged. If successful, the Shipyard Buffer will be
cleared, and the Committed documents will be updated.
**Note**: if there are unhandled runtime errors during the commitconfigdocs POST,
a deadlock situation may be possible. Future enhancements may improve this
handling.
##### Query Parameters
* force=true|**false**
By default, false, if there are validation failures the POST will fail with
a 400 response. With force=true, allows for the commit to succeed (with a 200
response) even if there are validation failures from downstream components. The
aggregate response of validation failures will be returned in this case, but
the invalid documents will still be moved from the Shipyard Buffer to the
Committed Documents.
##### Responses
* 200 OK
If the validations are successful. Returns an "empty" structure as as response
indicating no errors. A 200 may also be returned if there are validation
failures, but the force=true query parameter was specified. In this case, the
response will contain the list of validations.
* 400 Bad Request
If the validations fail. Returns a populated response structure containing
the aggregation of the failed validations.
* 409 Conflict
If the there is a POST to commitconfigdocs in progress.
---
## <a name="ActionAPI"></a> Action API
>The Shipyard Action API is a resource that allows for creation, control and
investigation of triggered workflows. These actions encapsulate a command
interface for the Undercloud Platform.
See [Action Commands](API_action_commands.md) for supported actions
---
### /v1.0/actions
#### Payload Structure
A list of actions that have been executed through shipyard's action API.
```
[
{ Action objects summarized, TBD },
...
]
```
#### GET
Returns the list of actions in the system that have been posted, and are
accessible to the current user.
##### Responses
* 200 OK
If the actions can be retrieved.
#### POST
Creates an action in the system. This will cause some action to start.
The input body to this post will represent an action object that has at least
these fields:
* name
The name of the action to invoke, as noted in
[Action Commands](API_action_commands.md)
* parameters
A dictionary of parameters to use for the trigger invocation. The supported
parameters will vary for the action invoked.
```
{
"name" : "action name",
"parameters" : { varies by action }
}
```
The POST will synchrounously create the action (a shell object that represents
a DAG invocation), perform any checks to validate the preconditions to run the
DAG, and trigger the invocation of the DAG. The DAG will run asynchronously in
airflow.
##### Responses
* 201 Created
If the action is created successfully, and all preconditions to run the DAG
are successful. The response body is the action entity created.
* 400 Bad Request
If the action name doesn't exist, or the payload is otherwise malformed.
* 409 Conflict
For any failed pre-run validations. The response body is the action entity
created, with the failed validations. The DAG will not begin execution in this
case.
---
### /v1.0/actions/{action_id}
Each action will be assigned an unique id that can be used to get details for
the action, including the execution status.
#### Payload Structure
All actions will include fields that indicate the following data:
* id (assigned during POST)
* name - the name of the action - likely to be the DAG Names, but may be mapped
for "nicer" values.
* parameters - a dictionary of the parameters configuring the action.
* tracking info - (user, time, etc)
* action_lifecycle value:
* Pending
* Validation Failed
* Processing
* Complete
* Failed
* DAG_status - representing the status that airflow provides for an executing
DAG
* validations - a list of validations that have been done, including any status
information for those validations. During the lifecycle of the DAG, this list
of validations may continue to grow.
* steps - the list of steps for this action, including the status for that
step.
```
{ TBD }
```
#### GET
Returns the action entity for the specified id.
##### Responses
* 200 OK
---
### /v1.0/actions/{action_id}/validationdetails/{validation_id}
Allows for drilldown to validation detailed info.
#### Payload Structure
The detailed information for a validation
```
{ TBD }
```
#### GET
Returns the validation detail by Id for the supplied action Id.
##### Responses
* 200 OK
---
### /v1.0/actions/{action_id}/steps/{step_id}
Allow for drilldown to step information. The step information includes details
of the steps excution, successful or not, and enough to facilitate
troubleshooting in as easy a fashion as possible.
#### Payload Structure
The detailed information representing a single step of execution as part of an
action.
```
{ TBD }
```
#### GET
Returns the details for a step by id for the given action by Id.
##### Responses
* 200 OK
---
### /v1.0/actions/{action_id}/control/{control_verb}
Allows for issuing DAG controls against an action.
#### Payload Structure
None, there is no associated body for this resource
#### POST
Trigger a control action against an activity.- this includes: pause, unpause
##### Responses
* 202 Accepted
---
## <a name="AirflowMonitoringAPI"></a> Airflow Monitoring API
>Airflow has a primary function of scheduling DAGs, as opposed to Shipyard's
primary case of triggering DAGs.
Shipyard provides functionality to allow for an operator to monitor and review
these scheduled workflows (DAGs) in addition to the ones triggered by Shipyard.
This API will allow for accessing Airflow DAGs of any type -- providing a peek
into the totality of what is happening in Airflow.
---
### /v1.0/workflows
The resource that represents DAGs (workflows) in airflow
#### Payload Structure
A list of objects representing the DAGs that have run in airflow.
```
[
{TBD},
...
]
```
#### GET
Queries airflow for DAGs that are running or have run (successfully or
unsuccessfully) and provides a summary of those things.
##### Query parameters
* since={iso8601 date (past) or duration}
optional, a boundary in the past within which to retrieve results. Default is
30 days in the past.
##### Responses
* 200 OK
---
### /v1.0/workflows/{id}
#### Payload Structure
An object representing the information available from airflow regarding a DAG's
execution
```
{ TBD }
```
#### GET
Further details of a particular scheduled DAG's output
##### Responses
* 200 OK