diff --git a/.gitignore b/.gitignore index d7cf78b7..c066f3e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store .idea .vscode *.pdf diff --git a/extensions/deploy_replace_undeploy/standard/sections/annex_bibliography.adoc b/extensions/deploy_replace_undeploy/standard/sections/annex_bibliography.adoc index 351430db..af4cdf44 100644 --- a/extensions/deploy_replace_undeploy/standard/sections/annex_bibliography.adoc +++ b/extensions/deploy_replace_undeploy/standard/sections/annex_bibliography.adoc @@ -21,7 +21,7 @@ Springer LNCS is widely used in technical and computer science journals and othe // * [[[Common_Workflow_Language,1]]], Peter Amstutz, Michael R. Crusoe, Nebojša Tijanić (editors), Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, Dan Leehr, Hervé Ménager, Maya Nedeljkovich, Matt Scales, Stian Soiland-Reyes, Luka Stojanovic (2016): Common Workflow Language, v1.0. Specification, Common Workflow Language working group. https://w3id.org/cwl/v1.0/ https://doi.org/10.6084/m9.figshare.3115156.v2 -* [[[Common_Workflow_Language,1]]], Peter Amstutz, Michael R. Crusoe, Nebojša Tijanić (editors), Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, Dan Leehr, Hervé Ménager, Maya Nedeljkovich, Matt Scales, Stian Soiland-Reyes, Luka Stojanovic (2020): Common Workflow Language, v1.2. Specification, Common Workflow Language working group. https://w3id.org/cwl/ +* [[[Common_Workflow_Language,1]]], Peter Amstutz, Michael R. Crusoe, Nebojša Tijanić (editors), Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, Dan Leehr, Hervé Ménager, Maya Nedeljkovich, Matt Scales, Stian Soiland-Reyes, Luka Stojanovic (2020): Common Workflow Language, v1.2. Specification, Common Workflow Language working group. https://w3id.org/cwl/v1.2/ * [[[OpenEO_Process_Graphs,2]]], OpenEO: OpenEO Developers API Reference / Process Graphs. https://openeo.org/documentation/1.0/developers/api/reference.html#section/Processes/Process-Graphs diff --git a/extensions/deploy_replace_undeploy/standard/sections/clause_0_front_material.adoc b/extensions/deploy_replace_undeploy/standard/sections/clause_0_front_material.adoc index 297dbd50..0218e57e 100644 --- a/extensions/deploy_replace_undeploy/standard/sections/clause_0_front_material.adoc +++ b/extensions/deploy_replace_undeploy/standard/sections/clause_0_front_material.adoc @@ -20,5 +20,5 @@ All questions regarding this submission should be directed to the editors or the | Panagiotis (Peter) A. Vretanos _(editor)_ | CubeWerx Inc. | Gérald Fenoy _(editor)_ | GeoLabs | Pedro Gonçalves | Terradue Srl. -| Francis Charette Migneault | Centre de Recherche en Informatique de Montréal (CRIM) |=== + diff --git a/extensions/job_management/README.md b/extensions/job_management/README.md new file mode 100644 index 00000000..0aeaaddf --- /dev/null +++ b/extensions/job_management/README.md @@ -0,0 +1,14 @@ +# Standard template + +This folder contains the content for the OGC API - Processes - Part 4: Job Management (JM). + +This extension provides the ability to create new jobs without starting its execution. Meaning that you can prepare a job and execute it later. This extension also provides ways to track history associated with the execution, starting with the job definition. + +The repo is organized as follows: + +* standard - the main standard document content + - organized in multiple sections and directories (recommendations, requirements, etc.) +* xml - normative XML/XSD components specified by the standard +* examples - JSON and XML examples + +The schemas associated with this extension are stored from the root directory in `openapi/*{api,parameters,path,responses,schemas}*/processes-job-management`. diff --git a/extensions/job_management/examples/json/README.md b/extensions/job_management/examples/json/README.md new file mode 100644 index 00000000..1e628fd3 --- /dev/null +++ b/extensions/job_management/examples/json/README.md @@ -0,0 +1 @@ +Add JSON examples to this directory. If not used, delete the directory. diff --git a/extensions/job_management/examples/xml/README.md b/extensions/job_management/examples/xml/README.md new file mode 100644 index 00000000..49822f55 --- /dev/null +++ b/extensions/job_management/examples/xml/README.md @@ -0,0 +1 @@ +Add XML examples to this directory. If not used, delete the directory. diff --git a/extensions/job_management/standard/24-051.adoc b/extensions/job_management/standard/24-051.adoc new file mode 100644 index 00000000..21fa01ec --- /dev/null +++ b/extensions/job_management/standard/24-051.adoc @@ -0,0 +1,56 @@ += OGC API - Processes - Part 4: Job Management +:doctype: standard +:docsubtype: implementation +:docnumber: 24-051 +:status: draft +:copyright-year: 2019 +:edition: 1.0 +:language: en +:published-date: yyyy-mm-dd +:received-date: yyyy-mm-dd +:issued-date: yyyy-mm-dd +:external-id: http://www.opengis.net/doc/IS/ogcapi-processes-4/1.0 +:keywords: process, instance, spatial, data, openapi, job, create, update, delete, add, remove, REST, PATCH, POST, DELETE +:submitting-organizations: Geolabs; Terradue Srl.; Computer Research Institute of Montréal (CRIM). +:editor: Gérald Fenoy +:mn-document-class: ogc +:mn-output-extensions: xml,html,doc,pdf + +//// +Make sure to complete each included document +//// +include::sections/clause_0_front_material.adoc[] + +include::sections/clause_1_scope.adoc[] + +include::sections/clause_2_conformance.adoc[] + +include::sections/clause_3_references.adoc[] + +include::sections/clause_4_terms_and_definitions.adoc[] + +include::sections/clause_5_conventions.adoc[] + +include::sections/clause_6_job_management.adoc[] + +include::sections/clause_7_ogcapi-processes.adoc[] + +include::sections/clause_8_openeo.adoc[] + +include::sections/clause_9_provenance.adoc[] + +include::sections/clause_10_oas.adoc[] + +include::sections/clause_11_media_types.adoc[] + +include::sections/clause_12_security_considerations.adoc[] + +include::sections/annex_ats.adoc[] + +//// +Revision History should be the last annex before the Bibliography +Bibliography should be the last annex +//// +include::sections/annex_history.adoc[] + +include::sections/annex_bibliography.adoc[] diff --git a/extensions/job_management/standard/README.md b/extensions/job_management/standard/README.md new file mode 100644 index 00000000..fbb80a62 --- /dev/null +++ b/extensions/job_management/standard/README.md @@ -0,0 +1 @@ +This folder contains the text for part 4 of the OGC API Processes standard. diff --git a/extensions/job_management/standard/abstract_tests/ATS_class_jm.adoc b/extensions/job_management/standard/abstract_tests/ATS_class_jm.adoc new file mode 100644 index 00000000..29691f59 --- /dev/null +++ b/extensions/job_management/standard/abstract_tests/ATS_class_jm.adoc @@ -0,0 +1,14 @@ +[[ats_jm]] +[conformance_class] +.Job Management +==== +[%metadata] +identifier:: http://www.opengis.net/spec/ogcapi-processes-4/1.0/conf/job-management +subject:: <> +classification:: Target Type:Web API +conformance-test:: /conf/dru/deploy/post-op +==== + +==== Create operation + +include::jm/create/ATS_post-op.adoc[] diff --git a/extensions/job_management/standard/abstract_tests/README.md b/extensions/job_management/standard/abstract_tests/README.md new file mode 100644 index 00000000..ee9b6e6d --- /dev/null +++ b/extensions/job_management/standard/abstract_tests/README.md @@ -0,0 +1,27 @@ +This folder contains the Abstract Test Suite. + +Each file describes a single test. The naming convention for these files is: + +"cc/TESTn.adoc" where "cc" corresponds to the identifier for the requirements class and "n" corresponds to the test number. Numbers should have preceeding zeros appropriate for the total number of tests in the conformance class (e.g., the first test could be TEST001 if less than 1000 tests are anticipated). + +The test is expressed according to this pattern: + +```` +===== Test case title + +(( additional discussion, if needed )) + +====== a) Test Purpose: +(( description )) + +====== b) Pre-conditions: +* (( list all preconditions )) + +====== c) Test Method: +* (( steps to execute and assertions to test )) + +====== d) References: +* <> +```` + +NOTE: for each test, there must be one or more requirements in the "requirements" folder. diff --git a/extensions/job_management/standard/abstract_tests/cc/TEST001.adoc b/extensions/job_management/standard/abstract_tests/cc/TEST001.adoc new file mode 100644 index 00000000..1c3db3b0 --- /dev/null +++ b/extensions/job_management/standard/abstract_tests/cc/TEST001.adoc @@ -0,0 +1,15 @@ +===== Test case title + +(( additional discussion, if needed )) + +====== a) Test Purpose: +(( description )) + +====== b) Pre-conditions: +* (( list all preconditions )) + +====== c) Test Method: +* (( steps to execute and assertions to test )) + +====== d) References: +* <> diff --git a/extensions/job_management/standard/abstract_tests/jm/create/ATS_post-op.adoc b/extensions/job_management/standard/abstract_tests/jm/create/ATS_post-op.adoc new file mode 100644 index 00000000..39b20206 --- /dev/null +++ b/extensions/job_management/standard/abstract_tests/jm/create/ATS_post-op.adoc @@ -0,0 +1,19 @@ +[[ats_jm_deploy_post-op]] + +[abstract_test] +==== +[%metadata] +identifier:: /conf/jm/create/post-op +target:: <> +test-purpose:: Validate that the server support HTTP POST operation at the path /jobs/ +test-method:: ++ +-- +1. Construct a path for the {root}/jobs path. + +2. Issue an HTTP POST request for each path. + +3. Validate that the response header does not contain `405 Method not allowed` +-- +==== + diff --git a/extensions/job_management/standard/figures/README.md b/extensions/job_management/standard/figures/README.md new file mode 100644 index 00000000..e5d667f5 --- /dev/null +++ b/extensions/job_management/standard/figures/README.md @@ -0,0 +1,5 @@ +Figures go here. + +Each figure is a separate file with the naming convention: + +"PTm_FIGn.xxx" where "m" is a number with leading zeroes appropriate for the total number of parts, "n" is a number with leading zeroes appropriate for the total number of figures and "xxx" is the appropriate extension for the file type. \ No newline at end of file diff --git a/extensions/job_management/standard/images/README.md b/extensions/job_management/standard/images/README.md new file mode 100644 index 00000000..c8f34049 --- /dev/null +++ b/extensions/job_management/standard/images/README.md @@ -0,0 +1,9 @@ +Image files for graphics go here. + +Each graphic is a separate file with the naming convention: + +"FIGn.xxx" where "n" is a number with leading zeroes appropriate for the total number of figures and "xxx" is the appropriate extension for the file type. + +or, for other graphics not associated with figures: + +"GRPn.xxx" where "n" is a sequential number with leading zeroes appropriate for the total number of graphics and "xxx" is the appropriate extension for the file type. diff --git a/extensions/job_management/standard/recommendations/README.md b/extensions/job_management/standard/recommendations/README.md new file mode 100644 index 00000000..b104434f --- /dev/null +++ b/extensions/job_management/standard/recommendations/README.md @@ -0,0 +1,2 @@ +OGC API - Processes - Part 4: Job Management recommendations. + diff --git a/extensions/job_management/standard/recommendations/job-management/PER_additional-status-codes.adoc b/extensions/job_management/standard/recommendations/job-management/PER_additional-status-codes.adoc new file mode 100644 index 00000000..6d477a7a --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/PER_additional-status-codes.adoc @@ -0,0 +1,7 @@ +[[per_job-management_additional-status-codes]] +[permission] +==== +[%metadata] +label:: /per/job-management/additional-status-codes +part:: Servers MAY support other HTTP protocol capabilities. Therefore, the server may return other status codes than those listed in <>. +==== diff --git a/extensions/job_management/standard/recommendations/job-management/create/PER_body.adoc b/extensions/job_management/standard/recommendations/job-management/create/PER_body.adoc new file mode 100644 index 00000000..226bdafc --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/create/PER_body.adoc @@ -0,0 +1,7 @@ +[[per_job-management_create_body]] +[permission] +==== +[%metadata] +label:: /per/job-management/create-body +part:: A server MAY support any encoding in the body of a HTTP POST operation. +==== diff --git a/extensions/job_management/standard/recommendations/job-management/create/PER_content-schema.adoc b/extensions/job_management/standard/recommendations/job-management/create/PER_content-schema.adoc new file mode 100644 index 00000000..a08ca702 --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/create/PER_content-schema.adoc @@ -0,0 +1,7 @@ +[[per_job-management_create_content-schema]] +[permission] +==== +[%metadata] +label:: /per/job-management/create-content-schema +part:: The `Content-Schema` header MAY be an URI to a JSON or OpenAPI 3.0 Schema document that describes the structure of the request body. +==== diff --git a/extensions/job_management/standard/recommendations/job-management/create/REC_body-ogcapi-processes.adoc b/extensions/job_management/standard/recommendations/job-management/create/REC_body-ogcapi-processes.adoc new file mode 100644 index 00000000..639d65c1 --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/create/REC_body-ogcapi-processes.adoc @@ -0,0 +1,8 @@ +[[rec_job-management_create_body-ogcapi-processes]] +[recommendation] +==== +[%metadata] +label:: /rec/job-management/create-body-ogcapi-processes + +part:: If the job can be encoded as an <>, implementation SHOULD consider supporting the <> encoding. +==== diff --git a/extensions/job_management/standard/recommendations/job-management/create/REC_body-openeo.adoc b/extensions/job_management/standard/recommendations/job-management/create/REC_body-openeo.adoc new file mode 100644 index 00000000..c352c0f5 --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/create/REC_body-openeo.adoc @@ -0,0 +1,8 @@ +[[rec_job-management_create_body-openeo]] +[recommendation] +==== +[%metadata] +label:: /rec/job-management/create-body-openeo + +part:: If the job can be encoded as an <>, implementation SHOULD consider supporting the <> encoding. +==== diff --git a/extensions/job_management/standard/recommendations/job-management/update/PER_body.adoc b/extensions/job_management/standard/recommendations/job-management/update/PER_body.adoc new file mode 100644 index 00000000..1cbdf74f --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/update/PER_body.adoc @@ -0,0 +1,7 @@ +[[per_job-management_update_body]] +[permission] +==== +[%metadata] +label:: /per/job-management/update-body +part:: A server MAY support any encoding in the body of a HTTP PATCH operation. +==== diff --git a/extensions/job_management/standard/recommendations/job-management/update/PER_content-schema.adoc b/extensions/job_management/standard/recommendations/job-management/update/PER_content-schema.adoc new file mode 100644 index 00000000..b7f4b949 --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/update/PER_content-schema.adoc @@ -0,0 +1,7 @@ +[[per_job-management_update_content-schema]] +[permission] +==== +[%metadata] +label:: /per/job-management/update-content-schema +part:: The `Content-Schema` header MAY be used to indicate the schema of a request body for updating a job. +==== diff --git a/extensions/job_management/standard/recommendations/job-management/update/REC_body-ogcapi-processes.adoc b/extensions/job_management/standard/recommendations/job-management/update/REC_body-ogcapi-processes.adoc new file mode 100644 index 00000000..04cac3ae --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/update/REC_body-ogcapi-processes.adoc @@ -0,0 +1,9 @@ +[[rec_job-management_update-ogcapi-processes]] +[recommendation] +==== +[%metadata] +label:: /rec/job-management/update-body-ogcapi-processes + +part:: If a job can be created from an <>, implementations SHOULD consider supporting the <> encoding. + +==== diff --git a/extensions/job_management/standard/recommendations/job-management/update/REC_body-openeo.adoc b/extensions/job_management/standard/recommendations/job-management/update/REC_body-openeo.adoc new file mode 100644 index 00000000..a9aebe4e --- /dev/null +++ b/extensions/job_management/standard/recommendations/job-management/update/REC_body-openeo.adoc @@ -0,0 +1,9 @@ +[[rec_job-management_update-openeo]] +[recommendation] +==== +[%metadata] +label:: /rec/job-management/update-body-openeo + +part:: If a job can be created from an <>, implementations SHOULD consider supporting the <> encoding. + +==== diff --git a/extensions/job_management/standard/recommendations/ogcapi-processes/create/PER_content-schema.adoc b/extensions/job_management/standard/recommendations/ogcapi-processes/create/PER_content-schema.adoc new file mode 100644 index 00000000..b045e411 --- /dev/null +++ b/extensions/job_management/standard/recommendations/ogcapi-processes/create/PER_content-schema.adoc @@ -0,0 +1,7 @@ +[[per_ogcapi-processes_create_content-schema]] +[permission] +==== +[%metadata] +label:: /per/ogcapi-processes/create-content-schema +part:: The `Content-Schema` header MAY be pointing to the OpenAPI 3.0 schema https://github.com/opengeospatial/ogcapi-processes/blob/master/openapi/schemas/processes-workflows/execute-workflows.yaml[execute-workflows.yaml]. +==== diff --git a/extensions/job_management/standard/recommendations/ogcapi-processes/update/PER_content-schema.adoc b/extensions/job_management/standard/recommendations/ogcapi-processes/update/PER_content-schema.adoc new file mode 100644 index 00000000..971cd3d3 --- /dev/null +++ b/extensions/job_management/standard/recommendations/ogcapi-processes/update/PER_content-schema.adoc @@ -0,0 +1,7 @@ +[[per_ogcapi-processes_update_content-schema]] +[permission] +==== +[%metadata] +label:: /per/ogcapi-processes/update-content-schema +part:: The `Content-Schema` header MAY be pointing to the OpenAPI 3.0 schema https://github.com/opengeospatial/ogcapi-processes/blob/master/openapi/schemas/processes-workflows/execute-workflows.yaml[execute-workflows.yaml]. +==== diff --git a/extensions/job_management/standard/recommendations/openeo/create/PER_content-schema.adoc b/extensions/job_management/standard/recommendations/openeo/create/PER_content-schema.adoc new file mode 100644 index 00000000..d332114f --- /dev/null +++ b/extensions/job_management/standard/recommendations/openeo/create/PER_content-schema.adoc @@ -0,0 +1,7 @@ +[[per_openeo_create_content-schema]] +[permission] +==== +[%metadata] +label:: /per/openeo/create-content-schema +part:: The `Content-Schema` header MAY be pointing to https://raw.githubusercontent.com/Open-EO/openeo-processes/master/meta/subtype-schemas.json#/definitions/process-graph[OpenEO Process Graph schema]. +==== diff --git a/extensions/job_management/standard/recommendations/openeo/update/PER_content-schema.adoc b/extensions/job_management/standard/recommendations/openeo/update/PER_content-schema.adoc new file mode 100644 index 00000000..fbe1c196 --- /dev/null +++ b/extensions/job_management/standard/recommendations/openeo/update/PER_content-schema.adoc @@ -0,0 +1,7 @@ +[[per_openeo_update_content-schema]] +[permission] +==== +[%metadata] +label:: /per/openeo/update-content-schema +part:: The `Content-Schema` header MAY be pointing to https://raw.githubusercontent.com/Open-EO/openeo-processes/master/meta/subtype-schemas.json#/definitions/process-graph[OpenEO Process Graph schema]. +==== diff --git a/extensions/job_management/standard/recommendations/provenance/run/PER_content-negotiation.adoc b/extensions/job_management/standard/recommendations/provenance/run/PER_content-negotiation.adoc new file mode 100644 index 00000000..4feb104a --- /dev/null +++ b/extensions/job_management/standard/recommendations/provenance/run/PER_content-negotiation.adoc @@ -0,0 +1,10 @@ +[[per_job-provenance_run_content-negotiation]] +[permission] +==== +[%metadata] +label:: /per/provenance/run-content-negotiation +part:: Content negotiation MAY be supported to provide alternate representations of the response. +part:: The server MAY support the following additional content type: `application/ld+json` for PROV-O as JSON-LD +part:: The server MAY support the following additional content type: `application/xml` for PROV-XML +part:: The server MAY support the following additional content type: `text/provenance-notation; charset="UTF-8"` for PROV-N. +==== diff --git a/extensions/job_management/standard/requirements/job-management/create/REQ_body.adoc b/extensions/job_management/standard/requirements/job-management/create/REQ_body.adoc new file mode 100644 index 00000000..f5569e5c --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/create/REQ_body.adoc @@ -0,0 +1,7 @@ +[[req_job-management_create_body]] +[requirement] +==== +[%metadata] +label:: /req/job-management/create-body +part:: The body of the POST request SHALL be in JSON format. +==== diff --git a/extensions/job_management/standard/requirements/job-management/create/REQ_content-type.adoc b/extensions/job_management/standard/requirements/job-management/create/REQ_content-type.adoc new file mode 100644 index 00000000..fd7f0ac2 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/create/REQ_content-type.adoc @@ -0,0 +1,7 @@ +[[req_job-management_create_content-type]] +[requirement] +==== +[%metadata] +label:: /req/job-management/create-content-type +part:: The `Content-Type` https://tools.ietf.org/html/rfc2616#section-14.17[header] SHALL be used to declare the media type of the request. +==== diff --git a/extensions/job_management/standard/requirements/job-management/create/REQ_post-op.adoc b/extensions/job_management/standard/requirements/job-management/create/REQ_post-op.adoc new file mode 100644 index 00000000..a6519248 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/create/REQ_post-op.adoc @@ -0,0 +1,7 @@ +[[req_job-management_create_post-op]] +[requirement] +==== +[%metadata] +label:: /req/job-management/create-post-op +part:: The server SHALL support the HTTP POST operation at the path `/jobs`. +==== diff --git a/extensions/job_management/standard/requirements/job-management/create/REQ_response-body.adoc b/extensions/job_management/standard/requirements/job-management/create/REQ_response-body.adoc new file mode 100644 index 00000000..3a456e40 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/create/REQ_response-body.adoc @@ -0,0 +1,8 @@ +[[req_job-management_create_response-body]] +[requirement] +==== +[%metadata] +label:: /req/job-management/create-response-body +part:: The response SHALL include a body that contains a status information of the created job that conforms to the https://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/schemas/statusInfo.yaml[statusInfo.yaml] schema. +part:: The response SHALL contain a `created` status code and the `id` property that contains the job identifier. +==== diff --git a/extensions/job_management/standard/requirements/job-management/create/REQ_response-jobid.adoc b/extensions/job_management/standard/requirements/job-management/create/REQ_response-jobid.adoc new file mode 100644 index 00000000..bd8ec9c9 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/create/REQ_response-jobid.adoc @@ -0,0 +1,7 @@ +[[req_job-management_create_response-jobid]] +[requirement] +==== +[%metadata] +label:: /req/job-management/create-response-jobid +part:: If the operation completes, the server SHALL generate a job identifier (i.e. `{jobId}`) for the created job. +==== diff --git a/extensions/job_management/standard/requirements/job-management/create/REQ_response-success.adoc b/extensions/job_management/standard/requirements/job-management/create/REQ_response-success.adoc new file mode 100644 index 00000000..aea1e23f --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/create/REQ_response-success.adoc @@ -0,0 +1,8 @@ +[[req_job-management_create_response_success]] +[requirement] +==== +[%metadata] +label:: /req/job-management/create-response-success +part:: A successful execution of the operation SHALL be reported as a response with a HTTP status code `201`. +part:: A response with HTTP status code `201` SHALL include a `Location` header with the URI of the deployed processes (path: `/jobs/{jobId}`). +==== diff --git a/extensions/job_management/standard/requirements/job-management/create/REQ_unsupported-media-type.adoc b/extensions/job_management/standard/requirements/job-management/create/REQ_unsupported-media-type.adoc new file mode 100644 index 00000000..504e2949 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/create/REQ_unsupported-media-type.adoc @@ -0,0 +1,11 @@ +[[req_job-management_create_unsupported-media-type]] +[requirement] +==== +[%metadata] +label:: /req/job-management/create-unsupported-media-type + +part:: If the server does not support the Content-Type header associated with the request body, the code of the response SHALL be `415 Unsupported Media Type`. +part:: The content of that response SHALL be based upon the OpenAPI +3.0 schema https://raw.githubusercontent.com/opengeospatial/ogcapi-processes/master/core/openapi/schemas/exception.yaml[exception.yaml]. +part:: The `type` of the exception SHALL be “http://www.opengis.net/def/exceptions/ogcapi-processes-4/1.0/unsupported-media-type”. +==== diff --git a/extensions/job_management/standard/requirements/job-management/create/REQ_unsupported-schema.adoc b/extensions/job_management/standard/requirements/job-management/create/REQ_unsupported-schema.adoc new file mode 100644 index 00000000..a0a94d1a --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/create/REQ_unsupported-schema.adoc @@ -0,0 +1,11 @@ +[[req_job-management_create_unsupported-schema]] +[requirement] +==== +[%metadata] +label:: /req/job-management/create-unsupported-schema + +part:: If the server does not support the Content-Schema header associated with the request body, the code of the response SHALL be `422 Unprocessable Content`. +part:: The content of that response SHALL be based upon the OpenAPI +3.0 schema https://raw.githubusercontent.com/opengeospatial/ogcapi-processes/master/core/openapi/schemas/exception.yaml[exception.yaml]. +part:: The `type` of the exception SHALL be “http://www.opengis.net/def/exceptions/ogcapi-processes-4/1.0/unsupported-schema”. +==== diff --git a/extensions/job_management/standard/requirements/job-management/definition/REQ_get-op.adoc b/extensions/job_management/standard/requirements/job-management/definition/REQ_get-op.adoc new file mode 100644 index 00000000..f3a25f2d --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/definition/REQ_get-op.adoc @@ -0,0 +1,9 @@ +[[req_job-management_definition_get-op]] +[requirement] +==== +[%metadata] +label:: /req/job-management/definition-get-op +part:: For every jobs (using method: POST on path: /jobs/{jobId}), the server SHALL support the HTTP GET operation at the path `/jobs/{jobId}/definition`. +part:: The parameter `jobId` is each `id` property in the job-list response (JSONPath: `$.jobs[*].id`). + +==== diff --git a/extensions/job_management/standard/requirements/job-management/definition/REQ_response-body.adoc b/extensions/job_management/standard/requirements/job-management/definition/REQ_response-body.adoc new file mode 100644 index 00000000..64ea12ca --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/definition/REQ_response-body.adoc @@ -0,0 +1,7 @@ +[[req_job-management_definition_response-body]] +[requirement] +==== +[%metadata] +label:: /req/job-management/definition-response-body +part:: A response with HTTP status code `200` SHALL include a body that contains the request body used to create or update the job. +==== diff --git a/extensions/job_management/standard/requirements/job-management/definition/REQ_response-success.adoc b/extensions/job_management/standard/requirements/job-management/definition/REQ_response-success.adoc new file mode 100644 index 00000000..ce526a09 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/definition/REQ_response-success.adoc @@ -0,0 +1,7 @@ +[[req_job-management_definition_response-success]] +[requirement] +==== +[%metadata] +label:: /req/job-management/definition-response-success +part:: A successful access to the resource SHALL be reported as a response with a HTTP status code `200`. +==== diff --git a/extensions/job_management/standard/requirements/job-management/start/REQ_post-op.adoc b/extensions/job_management/standard/requirements/job-management/start/REQ_post-op.adoc new file mode 100644 index 00000000..ec2a6278 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/start/REQ_post-op.adoc @@ -0,0 +1,8 @@ +[[req_job-management_start_post-op]] +[requirement] +==== +[%metadata] +label:: /req/job-management/start-post-op +part:: For every created jobs (path: `/jobs/{jobId}/results`), the server SHALL support the HTTP POST operation. +part:: The parameter `jobId` is each `jobID` property in the job list response (JSONPath: `$.jobs[*].id`). +==== diff --git a/extensions/job_management/standard/requirements/job-management/start/REQ_response.adoc b/extensions/job_management/standard/requirements/job-management/start/REQ_response.adoc new file mode 100644 index 00000000..15d04d16 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/start/REQ_response.adoc @@ -0,0 +1,8 @@ +[[req_job-management_start_response]] +[requirement] +==== +[%metadata] +label:: /req/job-management/start-response +part:: A successful execution of the operation SHALL be reported as a response with a HTTP status code '200'. +part:: A response SHALL be a document that conforms to statusInfo.yaml. +==== diff --git a/extensions/job_management/standard/requirements/job-management/update/REQ_body.adoc b/extensions/job_management/standard/requirements/job-management/update/REQ_body.adoc new file mode 100644 index 00000000..57eb938d --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/update/REQ_body.adoc @@ -0,0 +1,7 @@ +[[req_job-management_update_body]] +[requirement] +==== +[%metadata] +label:: /req/job-management/update-body +part:: The body of a PATCH request SHALL be in JSON format. +==== diff --git a/extensions/job_management/standard/requirements/job-management/update/REQ_content-type.adoc b/extensions/job_management/standard/requirements/job-management/update/REQ_content-type.adoc new file mode 100644 index 00000000..797615ca --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/update/REQ_content-type.adoc @@ -0,0 +1,7 @@ +[[req_job-management_update_content-type]] +[requirement] +==== +[%metadata] +label:: /req/job-management/update-content-type +part:: As per <> (https://tools.ietf.org/html/rfc2616#section-14.17) the 'Content-Type' header SHALL be used to indicate the media type of a request body. +==== diff --git a/extensions/job_management/standard/requirements/job-management/update/REQ_patch-op.adoc b/extensions/job_management/standard/requirements/job-management/update/REQ_patch-op.adoc new file mode 100644 index 00000000..75a25576 --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/update/REQ_patch-op.adoc @@ -0,0 +1,8 @@ +[[req_job-management_update_patch-op]] +[requirement] +==== +[%metadata] +label:: /req/job-management/update-patch-op +part:: For every created jobs (path '/jobs/{jobId}'), the server SHALL support the HTTP PATCH operation. +part:: The parameter 'jobId' is each 'jobID' property in the jobs list response (JSONPath: `$.jobs[*].id`). +==== diff --git a/extensions/job_management/standard/requirements/job-management/update/REQ_response-locked.adoc b/extensions/job_management/standard/requirements/job-management/update/REQ_response-locked.adoc new file mode 100644 index 00000000..14dc811c --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/update/REQ_response-locked.adoc @@ -0,0 +1,9 @@ +[[req_job-management_update_response-locked]] +[requirement] +==== +[%metadata] +label:: /req/job-management/update-response-locked +part:: If a job is locked, meaning that it is currently being processed (status set to `accepted` or `running`), the server SHALL respond with HTTP status code `423 Locked`. +part:: The response body SHALL be based upon the OpenAPI 3.0 schema https://raw.githubusercontent.com/opengeospatial/ogcapi-processes/master/core/openapi/schemas/exception.yaml[exception.yaml]. +part:: The `type` of the exception SHALL be “http://www.opengis.net/def/exceptions/ogcapi-processes-4/1.0/locked”. +==== diff --git a/extensions/job_management/standard/requirements/job-management/update/REQ_response.adoc b/extensions/job_management/standard/requirements/job-management/update/REQ_response.adoc new file mode 100644 index 00000000..8bcc709a --- /dev/null +++ b/extensions/job_management/standard/requirements/job-management/update/REQ_response.adoc @@ -0,0 +1,7 @@ +[[req_job-management_update_response]] +[requirement] +==== +[%metadata] +label:: /req/job-management/update-response +part:: A successful execution of the operation SHALL be reported as a response with a HTTP status code `200` or `204`. +==== diff --git a/extensions/job_management/standard/requirements/ogcapi-processes/REQ_schema.adoc b/extensions/job_management/standard/requirements/ogcapi-processes/REQ_schema.adoc new file mode 100644 index 00000000..883341da --- /dev/null +++ b/extensions/job_management/standard/requirements/ogcapi-processes/REQ_schema.adoc @@ -0,0 +1,7 @@ +[[req_ogcapi-processes_schema]] +[requirement] +==== +[%metadata] +label:: /req/ogcapi-processes/schema +part:: An `OGC API - Processes - Workflow - Execute Request` document SHALL be based upon the JSON schema https://github.com/opengeospatial/ogcapi-processes/blob/master/openapi/schemas/processes-workflows/execute-workflows.yaml[execute-workflow.yaml]. +==== diff --git a/extensions/job_management/standard/requirements/ogcapi-processes/create/REQ_body.adoc b/extensions/job_management/standard/requirements/ogcapi-processes/create/REQ_body.adoc new file mode 100644 index 00000000..22902e62 --- /dev/null +++ b/extensions/job_management/standard/requirements/ogcapi-processes/create/REQ_body.adoc @@ -0,0 +1,8 @@ +[[req_ogcapi-processes_create_body]] +[requirement] +==== +[%metadata] +label:: /req/ogcapi-processes/create-body +part:: The body of the POST request SHALL be based upon the OpenAPI 3.0 schema https://github.com/opengeospatial/ogcapi-processes/blob/master/openapi/schemas/processes-workflows/execute-workflows.yaml[execute-workflows.yaml] +part:: The media type `application/json` SHALL be used to indicate that request body contains a processes description encoded as an <>. +==== diff --git a/extensions/job_management/standard/requirements/ogcapi-processes/definition/REQ_response-body.adoc b/extensions/job_management/standard/requirements/ogcapi-processes/definition/REQ_response-body.adoc new file mode 100644 index 00000000..145d0a76 --- /dev/null +++ b/extensions/job_management/standard/requirements/ogcapi-processes/definition/REQ_response-body.adoc @@ -0,0 +1,7 @@ +[[req_ogcapi-processes_definition_response-body]] +[requirement] +==== +[%metadata] +label:: /req/ogcapi-processes/definition-response-body +part:: A response with HTTP status code `200` SHALL include a body that contains the <> to use to deploy the process. +==== diff --git a/extensions/job_management/standard/requirements/ogcapi-processes/update/REQ_body.adoc b/extensions/job_management/standard/requirements/ogcapi-processes/update/REQ_body.adoc new file mode 100644 index 00000000..fcb3e18d --- /dev/null +++ b/extensions/job_management/standard/requirements/ogcapi-processes/update/REQ_body.adoc @@ -0,0 +1,7 @@ +[[req_ogcapi-processes_update__body]] +[requirement] +==== +[%metadata] +label:: /req/ogcapi-processes/update-body +part:: The media type `application/ogcapi-processes+json` SHALL be used to indicate that request body contains a job encoded as an <>. +==== diff --git a/extensions/job_management/standard/requirements/openeo/REQ_schema.adoc b/extensions/job_management/standard/requirements/openeo/REQ_schema.adoc new file mode 100644 index 00000000..84634a7f --- /dev/null +++ b/extensions/job_management/standard/requirements/openeo/REQ_schema.adoc @@ -0,0 +1,7 @@ +[[req_openeo_schema]] +[requirement] +==== +[%metadata] +label:: /req/openeo/schema +part:: An `OpenEO Process Graph` document SHALL be based upon the OpenEO Process Graph JSON schema https://openeo.org/documentation/1.0/developers/api/assets/pg-schema.json. +==== diff --git a/extensions/job_management/standard/requirements/openeo/create/REQ_body.adoc b/extensions/job_management/standard/requirements/openeo/create/REQ_body.adoc new file mode 100644 index 00000000..4a24c5ba --- /dev/null +++ b/extensions/job_management/standard/requirements/openeo/create/REQ_body.adoc @@ -0,0 +1,7 @@ +[[req_openeo_create_body]] +[requirement] +==== +[%metadata] +label:: /req/openeo/create-body +part:: The media type `application/json` SHALL be used to indicate that request body contains a processes description encoded as an <>. +==== diff --git a/extensions/job_management/standard/requirements/openeo/definition/REQ_response-body.adoc b/extensions/job_management/standard/requirements/openeo/definition/REQ_response-body.adoc new file mode 100644 index 00000000..3bd5c4dc --- /dev/null +++ b/extensions/job_management/standard/requirements/openeo/definition/REQ_response-body.adoc @@ -0,0 +1,7 @@ +[[req_openeo_definition_response-body]] +[requirement] +==== +[%metadata] +label:: /req/openeo/definition-response-body +part:: A response with HTTP status code `200` SHALL include a body that contains the <> to use to deploy the process. +==== diff --git a/extensions/job_management/standard/requirements/openeo/update/REQ_body.adoc b/extensions/job_management/standard/requirements/openeo/update/REQ_body.adoc new file mode 100644 index 00000000..ed51285a --- /dev/null +++ b/extensions/job_management/standard/requirements/openeo/update/REQ_body.adoc @@ -0,0 +1,7 @@ +[[req_openeo_update__body]] +[requirement] +==== +[%metadata] +label:: /req/openeo/update-body +part:: The media type `application/json` SHALL be used to indicate that request body contains a job encoded as an <>. +==== diff --git a/extensions/job_management/standard/requirements/provenance/inputs/REQ_get-op.adoc b/extensions/job_management/standard/requirements/provenance/inputs/REQ_get-op.adoc new file mode 100644 index 00000000..d4174f99 --- /dev/null +++ b/extensions/job_management/standard/requirements/provenance/inputs/REQ_get-op.adoc @@ -0,0 +1,8 @@ +[[req_job-provenance_inputs_get-op]] +[requirement] +==== +[%metadata] +label:: /req/provenance/inputs-get-op +part:: For every created jobs (path: `/jobs/{jobId}/inputs`), the server SHALL support the HTTP GET operation. +part:: The parameter `jobId` is each `jobID` property in the job list response (JSONPath: `$.jobs[*].id`). +==== diff --git a/extensions/job_management/standard/requirements/provenance/inputs/REQ_response.adoc b/extensions/job_management/standard/requirements/provenance/inputs/REQ_response.adoc new file mode 100644 index 00000000..9d4d29a3 --- /dev/null +++ b/extensions/job_management/standard/requirements/provenance/inputs/REQ_response.adoc @@ -0,0 +1,8 @@ +[[req_provenance_inputs_response]] +[requirement] +==== +[%metadata] +label:: /req/provenance/inputs-response +part:: A successful execution of the operation SHALL be reported as a response with a HTTP status code '200'. +part:: The response SHALL contains a JSON document that conforms to the schema https://github.com/opengeospatial/ogcapi-processes/blob/master/openapi/schemas/processes-job-management/inputs.yaml[inputs.yaml]. +==== diff --git a/extensions/job_management/standard/requirements/provenance/run/REQ_get-op.adoc b/extensions/job_management/standard/requirements/provenance/run/REQ_get-op.adoc new file mode 100644 index 00000000..a2ca4da7 --- /dev/null +++ b/extensions/job_management/standard/requirements/provenance/run/REQ_get-op.adoc @@ -0,0 +1,8 @@ +[[req_job-provenance_run_get-op]] +[requirement] +==== +[%metadata] +label:: /req/provenance/run-get-op +part:: For every created jobs (path: `/jobs/{jobId}/run`), the server SHALL support the HTTP GET operation. +part:: The parameter `{jobId}` is each `id` property in the job list response (JSONPath: `$.jobs[*].id`). +==== diff --git a/extensions/job_management/standard/requirements/provenance/run/REQ_response.adoc b/extensions/job_management/standard/requirements/provenance/run/REQ_response.adoc new file mode 100644 index 00000000..f31d4963 --- /dev/null +++ b/extensions/job_management/standard/requirements/provenance/run/REQ_response.adoc @@ -0,0 +1,9 @@ +[[req_provenance_run_response]] +[requirement] +==== +[%metadata] +label:: /req/provenance/run-response +part:: A successful execution of the operation SHALL be reported as a response with a HTTP status code '200'. +part:: Per default, the response SHALL contains a JSON document that conforms to the https://www.w3.org/submissions/prov-json/schema[schema for PROV-JSON]. +part:: In case content-negotiation is used, the response MAY contain other representations including PROV-O as JSON-LD, PROV-XML or PROV-N. +==== diff --git a/extensions/job_management/standard/requirements/requirements_class_job-management.adoc b/extensions/job_management/standard/requirements/requirements_class_job-management.adoc new file mode 100644 index 00000000..f27ba10e --- /dev/null +++ b/extensions/job_management/standard/requirements/requirements_class_job-management.adoc @@ -0,0 +1,10 @@ +[[rc_job-mangement]] +[requirements_class] +==== +[%metadata] +label:: http://www.opengis.net/spec/ogcapi-processes-4/1.0/req/job-management +obligation:: requirement +subject:: Web API +inherit:: <> +inherit:: <> +==== diff --git a/extensions/job_management/standard/requirements/requirements_class_ogcapi-processes.adoc b/extensions/job_management/standard/requirements/requirements_class_ogcapi-processes.adoc new file mode 100644 index 00000000..8055d503 --- /dev/null +++ b/extensions/job_management/standard/requirements/requirements_class_ogcapi-processes.adoc @@ -0,0 +1,11 @@ +[[rc_ogcapi-processes]] +[requirements_class] +==== +[%metadata] +label:: http://www.opengis.net/spec/ogcapi-processes-4/1.0/req/ogcapi-processes +obligation:: requirement +subject:: Web API +inherit:: <> +inherit:: <> +inherit:: <> +==== diff --git a/extensions/job_management/standard/requirements/requirements_class_openeo.adoc b/extensions/job_management/standard/requirements/requirements_class_openeo.adoc new file mode 100644 index 00000000..33da4b0f --- /dev/null +++ b/extensions/job_management/standard/requirements/requirements_class_openeo.adoc @@ -0,0 +1,9 @@ +[[rc_openeo]] +[requirements_class] +==== +[%metadata] +label:: http://www.opengis.net/spec/ogcapi-processes-4/1.0/req/openeo +obligation:: requirement +subject:: Web API +inherit:: <> +==== diff --git a/extensions/job_management/standard/requirements/requirements_class_provenance.adoc b/extensions/job_management/standard/requirements/requirements_class_provenance.adoc new file mode 100644 index 00000000..491d6644 --- /dev/null +++ b/extensions/job_management/standard/requirements/requirements_class_provenance.adoc @@ -0,0 +1,9 @@ +[[rc_cwl]] +[requirements_class] +==== +[%metadata] +label:: http://www.opengis.net/spec/ogcapi-processes-4/1.0/req/provenance +obligation:: requirement +subject:: Web API +inherit:: <> +==== diff --git a/extensions/job_management/standard/sections/annex_ats.adoc b/extensions/job_management/standard/sections/annex_ats.adoc new file mode 100644 index 00000000..91d9d95a --- /dev/null +++ b/extensions/job_management/standard/sections/annex_ats.adoc @@ -0,0 +1,15 @@ +[[ats]] +[appendix,obligation="normative"] +== Abstract Test Suite + +=== Introduction + +OGC Web Application Programming Interfaces (APIs) are not Web Services in the traditional sense. Rather, they define the behavior and content of a set of Resources exposed through a Web API. Therefore, an API endpoint may expose resources in addition to those defined by the standard. A test engine must be able to traverse an implementation of the API, identify and validate test points, and ignore resource paths which are not to be tested. + +The Web API under test can require authorization. Any Executable Test Suite implementing this test suite should implement the following security schemes supported by OpenAPI 3.0: HTTP Authorization schemes "basic" and "bearer", API keys, and OAuth2 flow "authorizationCode". + + +=== Conformance Class Job Management + +include::../abstract_tests/ATS_class_jm.adoc[] + diff --git a/extensions/job_management/standard/sections/annex_bibliography.adoc b/extensions/job_management/standard/sections/annex_bibliography.adoc new file mode 100644 index 00000000..af4cdf44 --- /dev/null +++ b/extensions/job_management/standard/sections/annex_bibliography.adoc @@ -0,0 +1,29 @@ +[bibliography] +[[Bibliography]] +== Bibliography + +//// +The TC has approved Springer LNCS as the official document citation type. + +Springer LNCS is widely used in technical and computer science journals and other publications + +* For citations in the text please use square brackets and consecutive numbers: [1], [2], [3] + +– Actual References: + +[n] Journal: Author Surname, A.: Title. Publication Title. Volume number, Issue number, Pages Used (Year Published) + +[n] Web: Author Surname, A.: Title, http://Website-Url + +* [[[OGC2015,OGCTB12]]], _OGC: OGC Testbed 12 Annex B: Architecture_ (2015). + +//// + +// * [[[Common_Workflow_Language,1]]], Peter Amstutz, Michael R. Crusoe, Nebojša Tijanić (editors), Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, Dan Leehr, Hervé Ménager, Maya Nedeljkovich, Matt Scales, Stian Soiland-Reyes, Luka Stojanovic (2016): Common Workflow Language, v1.0. Specification, Common Workflow Language working group. https://w3id.org/cwl/v1.0/ https://doi.org/10.6084/m9.figshare.3115156.v2 + +* [[[Common_Workflow_Language,1]]], Peter Amstutz, Michael R. Crusoe, Nebojša Tijanić (editors), Brad Chapman, John Chilton, Michael Heuer, Andrey Kartashov, Dan Leehr, Hervé Ménager, Maya Nedeljkovich, Matt Scales, Stian Soiland-Reyes, Luka Stojanovic (2020): Common Workflow Language, v1.2. Specification, Common Workflow Language working group. https://w3id.org/cwl/v1.2/ + +* [[[OpenEO_Process_Graphs,2]]], OpenEO: OpenEO Developers API Reference / Process Graphs. https://openeo.org/documentation/1.0/developers/api/reference.html#section/Processes/Process-Graphs + +* [[[OpenAPI-Spec,OpenAPI Specification 3.0.2]]] OpenAPI Initiative. OpenAPI Specification 3.0.2. Available at: +https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md. diff --git a/extensions/job_management/standard/sections/annex_history.adoc b/extensions/job_management/standard/sections/annex_history.adoc new file mode 100644 index 00000000..9771e1ec --- /dev/null +++ b/extensions/job_management/standard/sections/annex_history.adoc @@ -0,0 +1,8 @@ +[appendix] +== Revision History + +[cols="12,18,12,12,46",options="header,unnumbered"] +|=== +|Date |Release |Editor | Primary clauses modified |Description +|2024-08-22 |None |Gérald Fenoy |all |Boostraping the document +|=== diff --git a/extensions/job_management/standard/sections/clause_0_front_material.adoc b/extensions/job_management/standard/sections/clause_0_front_material.adoc new file mode 100644 index 00000000..6bfafa81 --- /dev/null +++ b/extensions/job_management/standard/sections/clause_0_front_material.adoc @@ -0,0 +1,28 @@ + +[abstract] +== Abstract + +OGC API Standards define modular API building blocks to spatially enable Web APIs in a consistent way. The <> is used to define the API building blocks. + +The OGC API Processes Standard (aka Processes API) defines API building blocks to describe, execute, monitor and retrieve results of Web-accessible processes. OGC API Processes is comprised of multiple parts, each of them is a separate OGC Standard. + +The OGC API - Processes - Part 2: Deploy, Replace, Undeploy draft specification extends the core capabilities specified in OGC API - Processes - Part 1: Core [<>] with the ability to dynamically add, modify and/or delete individual processes using an implementation (endpoint) of the OGC API - Processes Standard. + +The OGC API - Processes - Part 3: Workflows draft specification extends the core capabilities specified in OGC API - Processes - Part 1: Core [<>] with the ability to ... + +The OGC API - Processes - Part 4: Job Management draft specification extends the core capabilities specified in OGC API - Processes - Part 1: Core [<>] with the ability to create, manage and monitor jobs that are associated with processes execution. This part of the standard also defines how to ensure provenance information is preserved and findable. + +CAUTION: This is a DRAFT version of the 4th part of the OGC API - Processes standards. This draft is not complete and there are open issues that are still under discussion. + +== Submitters + +All questions regarding this submission should be directed to the editors or the submitters: + +[cols="2",options="header,unnumbered"] +|=== +| Name | Affiliation +| Gérald Fenoy _(editor)_ | GeoLabs +| Francis Charette Mignault _(editor)_ | Centre de recherche informatique de Montréal (CRIM) +| Panagiotis (Peter) A. Vretanos | CubeWerx Inc. +|=== + diff --git a/extensions/job_management/standard/sections/clause_10_oas.adoc b/extensions/job_management/standard/sections/clause_10_oas.adoc new file mode 100644 index 00000000..45e1367d --- /dev/null +++ b/extensions/job_management/standard/sections/clause_10_oas.adoc @@ -0,0 +1,5 @@ + +[[oas]] +== OpenAPI 3.0 + +See <>, Clause 9. diff --git a/extensions/job_management/standard/sections/clause_11_media_types.adoc b/extensions/job_management/standard/sections/clause_11_media_types.adoc new file mode 100644 index 00000000..656fc359 --- /dev/null +++ b/extensions/job_management/standard/sections/clause_11_media_types.adoc @@ -0,0 +1,4 @@ +[[mediatypes]] +== Media Types + +See <>, Clause 13. diff --git a/extensions/job_management/standard/sections/clause_12_security_considerations.adoc b/extensions/job_management/standard/sections/clause_12_security_considerations.adoc new file mode 100644 index 00000000..853730a8 --- /dev/null +++ b/extensions/job_management/standard/sections/clause_12_security_considerations.adoc @@ -0,0 +1,119 @@ +== Security Considerations + +See <>, Clause 10.4. + +Since creating and updating jobs will change the jobs available to a client, servers will - in almost all cases - restrict the access to these operations. + +Users making modifications to process resources need to: + +. Be authenticated, +. Have "modification privileges" on the jobs offered through the API, +. Have access to one or more of the POST and/or PUT methods on the jobs /jobs/{jobId} endpoints. + +The API definition, as defined in Clause 7.3 from <>, must reflect this in the resource paths and their available methods. + +Examples in the Clauses specifying the requirements classes focus on the mechanics of the POST, PUT, and DELETE methods and exclude authentication. Since authentication will typically be required for all DRU requests, this section provides some examples/guidance: + +The OpenAPI definition exposed by the serve will declare the authentication schemes that an implementation of the Processes - Part 4 (JM) supports for each operation (or for all operations in the API implementation). + +A member "security" in the OpenAPI definition object can be provided to list the default security schemes supported by all operations. Individual DRU operations can override this default by providing a "security" member for the individual operation. + +[#auth-example-1,reftext=`Example OpenAPI definition with security requirements`] +.Example OpenAPI definition with security requirements +==== +The following OpenAPI definition declares that the API accepts either api keys in an "X-API-Key" header or Json Web Token (JWT) bearer tokens to authenticate the requestor. X-API-KEY is a custom HTTP header that can be used to secure APIs. The API implementation will decide, if an authenticated request is rejected or executed based on the privileges of the authenticated user. + +[source,JSON] +---- +{ + "openapi" : "3.0.3", + "info" : { + "title" : "My API", + "description" : "This API ...", + "version" : "1.0.0" + }, + "servers" : [ { + "url" : "https://example.com/api/v1" + } ], + "security" : [ { + "JWT" : [ ], + "api_key": [ ] + } ], + "paths" : { }, + "components" : { + "securitySchemes": { + "JWT" : { + "type" : "http", + "scheme" : "bearer", + "bearerFormat" : "JWT" + }, + "api_key" : { + "type": "apiKey", + "name": "X-API-Key", + "in": "header" + } + } + } +} +---- +==== + +If the authentication of a secured request fails or if the user does not have sufficient privileges, the API endpoint will return an error. + +In case the request does not include information to authenticate the user, the server will respond with a 401 response ("Unauthorized"). The response will include a "WWW-Authenticate" header with hints as to how authentication credentials are provided. + +[#auth-example-2,reftext=`Unauthorized request`] +.Unauthorized request + +---- +Client Server + | | + | POST /jobs/xxxx-xxx-xxx-xxxxx HTTP/1.1 | + | ----------------------------------------------------------->| + | | + | HTTP/1.1 401 Unauthorized | + | Date: Mon, 23 May 2022 11:18:45 GMT | + | WWW-Authenticate: Bearer realm="my-realm" | + | WWW-Authenticate: ApiKey header="X-API-Key" | + | Content-Type: application/problem+json | + | Vary: Accept | + | Content-Length: 86 | + | | + | { | + | "status": 401, | + | "title": "Unauthorized", | + | "detail": "HTTP 401 Unauthorized" | + | } | + | <-----------------------------------------------------------| +---- + +NOTE: HTTP WWW-Authenticate header is a response-type header. It serves as a support for various authentication mechanisms which are important to control access to pages and other resources as well. All of these mechanisms are based on the use of the 401 status code. The HTTP WWW-Authenticate response header defines the authentication method that ought to be wont to gain access to a resource. As discussed earlier, the WWW-Authenticate header is sent along with a 401 Unauthorized response. (GeeksforGeeks.org, 2023) + +If valid authentication credentials have been provided, but the API refuses to execute the operation, because the user has insufficient privileges, the server will typically return a 403 response ("Forbidden"). + +[#auth-example-3,reftext=`Forbidden request`] +.Forbidden request + +``` +Client Server + | | + | POST /jobs/xxxx-xxx-xxx-xxxxx HTTP/1.1 | + | Host: example.com | + | Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ97HgQ | + |------------------------------------------------------------------>| + | | + | HTTP/1.1 403 Forbidden | + | Date: Mon, 23 May 2022 11:18:55 GMT | + | Content-Type: application/problem+json | + | Vary: Accept | + | Content-Length: 80 | + | | + | { | + | "status" : 403, | + | "title" : "Forbidden", | + | "detail" : "HTTP 403 Forbidden" | + | } | + |<------------------------------------------------------------------| +``` + +However, for security reasons, the server may also decide to return other status codes to hide information from a potential attacker. For example, the server may decide to return a 401 response even for a valid, but un-privileged user. Or the server may return a 404 response ("Not Found") to hide the fact that the resource exists in the first place, typically if the user would also not be privileged to fetch the resource with a GET operation. \ No newline at end of file diff --git a/extensions/job_management/standard/sections/clause_1_scope.adoc b/extensions/job_management/standard/sections/clause_1_scope.adoc new file mode 100644 index 00000000..4678be08 --- /dev/null +++ b/extensions/job_management/standard/sections/clause_1_scope.adoc @@ -0,0 +1,13 @@ +== Scope + +The OGC API - Processes - Part 4 Standard is an extension to the OGC API – Processes – Part 1: Core Standard [<>] and defines the behavior of a server that +supports the ability to create jobs without implying the process execution starts right away. + +Specifically, the Processes Part 4 Standard specifies: + +* How to manage job. + +* How to handle provenenance information associated with a job. + + + diff --git a/extensions/job_management/standard/sections/clause_2_conformance.adoc b/extensions/job_management/standard/sections/clause_2_conformance.adoc new file mode 100644 index 00000000..bec04fe6 --- /dev/null +++ b/extensions/job_management/standard/sections/clause_2_conformance.adoc @@ -0,0 +1,31 @@ + +== Conformance + +The OGC API - Processes - Part 4 Standard defines the following requirements classes. + +The main requirements class is: + +* <>. + +This class specifies requirements that any Web API implementing Processes Part 4 must conform with. + +The `Job Management` class does not mandate a specific encoding for the job definition. +However, the Part 4 extension defines the following conformance class: + +* <> +* <> + +The `OGC API - Processes - Workflow Execute Request` class defines that jobs can be created from an OGC API - Processes - Workflow Execute Request. + +The `OpenEO Process Graph` class defines that jobs can be created from an OpenEO Process Graph. + +The provenance information associated with a job is not mandated to be supported by the server. +A dedicated requirements class <> is defined for this feature. + +The standardization target for all Conformance class defined in this Standard is “Web API”. + +Conformance with this Standard shall be checked using all the relevant tests +specified in <> of this document. The framework, concepts, and +methodology for testing, and the criteria to be achieved to claim conformance +are specified in the OGC Compliance Testing Policies and Procedures and the +OGC Compliance Testing web site. diff --git a/extensions/job_management/standard/sections/clause_3_references.adoc b/extensions/job_management/standard/sections/clause_3_references.adoc new file mode 100644 index 00000000..71ab4ace --- /dev/null +++ b/extensions/job_management/standard/sections/clause_3_references.adoc @@ -0,0 +1,13 @@ + +[bibliography] +== References + +* [[[OAProc-1,OGC 18-062]]] Pross, B.: OGC 18-062, *OGC API - Processes - Part 1: Core* + +* [[[OAProc-2,OGC 20-044]]] Fenoy, G.: OGC 20-044, *OGC API - Processes - Part 2: Deploy, Replace, Undeploy* + +* [[[OAProc-3,OGC 21-009]]] Jacovella-St-Louis J.: OGC 21-009, *OGC API - Processes - Part 3: Workflows* + +* [[[OAFeat-1,OGC 17-069r3]]], OGC Portele C.: 17-069r3, *OGC API - Features - Part 1: Core* + +* [[rfc6902,IETF RFC 6902]] Bryan, P., Nottingham, M.: IETF RFC 6902, *JavaScript Object Notation (JSON) Patch*, 2013 http://tools.ietf.org/rfc/rfc6902.txt diff --git a/extensions/job_management/standard/sections/clause_4_terms_and_definitions.adoc b/extensions/job_management/standard/sections/clause_4_terms_and_definitions.adoc new file mode 100644 index 00000000..b81b8bf2 --- /dev/null +++ b/extensions/job_management/standard/sections/clause_4_terms_and_definitions.adoc @@ -0,0 +1,10 @@ + +== Terms, definitions and abbreviated terms + +=== Terms and definitions + +See <>, Clause 4.1. + +=== Abbreviated Terms + +See <>, Clause 4.2. \ No newline at end of file diff --git a/extensions/job_management/standard/sections/clause_5_conventions.adoc b/extensions/job_management/standard/sections/clause_5_conventions.adoc new file mode 100644 index 00000000..af2b0125 --- /dev/null +++ b/extensions/job_management/standard/sections/clause_5_conventions.adoc @@ -0,0 +1,4 @@ + +== Conventions and background + +See <>, Clause 5. diff --git a/extensions/job_management/standard/sections/clause_6_job_management.adoc b/extensions/job_management/standard/sections/clause_6_job_management.adoc new file mode 100644 index 00000000..6b39e92f --- /dev/null +++ b/extensions/job_management/standard/sections/clause_6_job_management.adoc @@ -0,0 +1,258 @@ +== Requirements Class "Job Management" + +[[job-management]] +=== Overview + +include::../requirements/requirements_class_job-management.adoc[] + +A server that implements the Job Management Requirements Class provides the ability to +create, update and start jobs. + +The HTTP POST method on the `/jobs` path is used on to create new jobs. + +The HTTP PATCH method on the `/jobs/{jobId}` is used to update the definition of a previously created jobs that are accessible via the Processes API endpoint. + +Finally, the HTTP POST method on the `/job/{jobId}/results` is used to start a job. + +Creating or updating a job requires that a formal description of the new or +updated jobs be provided by the client. This Standar does not +mandate that a specific jobs schema be used. +However, this extension defines the following conformance +classe: + + * <>, that enables support for OGC API - Processes - Part 3: Wofklows for jobs definitions. + * <>, that enables support for OpenEO-encoded jobs definitions. + + +[[job-management-http_status_codes]] +==== HTTP status codes + +Clients implementing the Processes API Part 4 should be prepared to handle any legal HTTP or HTTPS status code. + +The *Status Codes* listed in <> are of particular relevance to implementors of this Standard. Status codes 200, 201 and 404 are called out in API requirements. Therefore, support for these status codes is mandatory for all compliant implementations. The remainder of the status codes in <> are not mandatory, but are important for the implementation of a well functioning API implementation. Support for these status codes is strongly encouraged for both client and server implementations. + +[[status_codes]] +.Typical HTTP status codes +[cols="15,85",options="header"] +|=== +|Status code |Description +|`200` |A successful request. +|`201` |The server has successfully completed the operation and a new resource has been created. +|`202` |The request was accepted for processing, but the processing was not completed. The request might or might not eventually be acted upon, as it might be disallowed when processing actually takes place. +|`204` |A successful request with no additional content to send in the response. +|`400` |The server cannot or will not process the request due to an apparent client error. For example, a query parameter had an incorrect value. +|`401` |The request requires user authentication. The response includes a `WWW-Authenticate` header field containing a challenge applicable to the requested resource. +|`403` |The server understood the request, but is refusing to execute the request. While status code `401` indicates missing or bad authentication, status code `403` indicates that authentication is not the issue, but that the client is not authorized to perform the requested operation on the resource. +|`404` |The requested resource does not exist on the server. For example, a path parameter had an incorrect value. +|`405` |The request method is not supported. For example, a POST request was submitted, but the resource only supports GET requests. +|`406` |Content negotiation failed. For example, the `Accept` header submitted in the request did not support any of the media types supported by the server for the requested resource. +|`412` |The status code indicates that one or more conditions given in the request header fields evaluated to false when tested by the server. +|`413` |The server is refusing to process the request because the request content is larger than the server is willing or able to process. +|`415` |The server is refusing to service the request because the content is in a format not supported by this method on the target resource. +|`422` |The server understands the content type of the request content and the syntax of the request content is correct, but was unable to process the contained instructions. For example, the submitted resource does not meet a semantic constraint, e.g. a mandatory property is missing. +|`500` |An internal error occurred in the server. +|=== + +NOTE: Status code `422` is not yet an official HTTP status code, but is expected to be added by the https://www.ietf.org/archive/id/draft-ietf-httpbis-semantics-14.html#name-422-unprocessable-content[draft IETF RFC "HTTP Semantics"]. + +More specific guidance is provided for each resource, where applicable. + +include::../recommendations/job-management/PER_additional-status-codes.adoc[] + +The API Description Document describes the HTTP status codes generated by that API imeplementation instance. This should not be an exhaustive list of all possible status codes. It is not reasonable to expect an API designer to control the use of HTTP status codes which are not generated by their software. Therefore, it is recommended that the API Description Document be limited to describing HTTP status codes relevant to the proper operation of the API application logic. Client implementations should be prepared to receive HTTP status codes in addition to those described in the API Description Document. + +[[cross_origin]] +==== Cross-origin requests + +See <>, section link:http://www.opengis.net/doc/IS/ogcapi-features-1/1.0#cross_origin[Support for cross-origin requests], about the importance of supporting cross-origin requests, typically via link:https://en.wikipedia.org/wiki/Cross-origin_resource_sharing[Cross-origin resource sharing (CORS)]. + + + +[[job-management-create]] +=== Creating a new job + +==== Sequence diagram + +The following diagram illustrates the sequence diagram for deploying +a new process to the API: + + +``` +Client Server + | | + | POST /jobs HTTP/1.1 | + | Content-Type: application/json | + | | + |------------------------------------------------------------>| + | | + | HTTP/1.1 201 Created | + | Location: /jobs/{jobId} | + |<------------------------------------------------------------| +``` + + +==== Operation + +include::../requirements/job-management/create/REQ_post-op.adoc[] + +==== Request body + +===== Overview + +include::../requirements/job-management/create/REQ_body.adoc[] + +include::../recommendations/job-management/create/PER_body.adoc[] + +include::../requirements/job-management/create/REQ_content-type.adoc[] + +See https://www.rfc-editor.org/rfc/rfc7231#section-3.1.1.5[section 3.1.1.5 of RFC 7231] for details. + +include::../recommendations/job-management/create/PER_content-schema.adoc[] + +===== OGC API - Processes - Workflow Execute Request body + +include::../recommendations/job-management/create/REC_body-ogcapi-processes.adoc[] + +===== OpenEO Process Graph body + +include::../recommendations/job-management/create/REC_body-openeo.adoc[] + + +==== Response + +include::../requirements/job-management/create/REQ_response-jobid.adoc[] + +include::../requirements/job-management/create/REQ_response-success.adoc[] + +include::../requirements/job-management/create/REQ_response-body.adoc[] + +==== Exceptions + +See <> for general guidance. + +If the request body's media type is not supported by the server, see requirement /req/deploy-replace-undeploy/deploy/unsupported-media-type from <>. + +include::../requirements/job-management/create/REQ_unsupported-schema.adoc[] + + +[[job-management-update]] +=== Updating an existing job + +==== Sequence diagram + +The following diagram illustrates the sequence diagram for updating a +previously created job. The identifier of the job does not change. + +NOTE: The new job definition replaces the old job definition. Version control is not discussed in this Standard. + +``` +Client Server + | | + | PATCH /jobs/{jobId} HTTP/1.1 | + | Content-Type: application/json | + | | + |------------------------------------------------------------>| + | | + | HTTP/1.1 200 OK | + |<------------------------------------------------------------| +``` + +==== Operation + +include::../requirements/job-management/update/REQ_patch-op.adoc[] + +==== Request body + +==== Overview + +include::../requirements/job-management/update/REQ_body.adoc[] + +include::../recommendations/job-management/update/PER_body.adoc[] + +include::../requirements/job-management/update/REQ_content-type.adoc[] + +include::../recommendations/job-management/update/PER_content-schema.adoc[] + +===== OGC API - Processes - Workflow Execute Request + +include::../recommendations/job-management/update/REC_body-ogcapi-processes.adoc[] + +===== OpenEO Process Graph + +include::../recommendations/job-management/update/REC_body-openeo.adoc[] + +==== Response + +include::../requirements/job-management/update/REQ_response.adoc[] + +The status code depends on the server. If the server has replaced the job, the response is either `200` (if the response includes additional content) or `204` (if the response has no additional content). + +==== Exceptions + +See <> for general guidance. + +If the request body's media type is not supported by the server, see requirement /req/deploy-replace-undeploy/deploy/unsupported-media-type from <>. + +If the job with the specified identifier does not exist on the server, see requirement /req/core/job-exception-no-such-job from <>. + +include::../requirements/job-management/update/REQ_response-locked.adoc[] + +[[job-management-start]] +=== Staring a job + +==== Sequence diagram + +The following diagram illustrates the sequence diagram for starting +the execution of a previously created jobs. + + +``` +Client Server + | | + | POST /jobs/{jobId}/results HTTP/1.1 | + |------------------------------------------------------------>| + | | + | HTTP/1.1 200 OK | + |<------------------------------------------------------------| +``` + +==== Operation + +include::../requirements/job-management/start/REQ_post-op.adoc[] + +==== Response + +include::../requirements/job-management/start/REQ_response.adoc[] + +==== Exceptions + +See <> for general guidance. + +If the job with the specified identifier does not exist on the server, see requirement /req/core/job-exception-no-such-job from <>. + +If the job with the specified identifier is locked, see requirement /req/job-management/update/response-locked from <>. + + +[[job-management-definition]] +=== Job definition + +For every job, it is possible to retrieve its original definition. It corresponds to the request's body used to create or update the jobs. + +==== Operation + +include::../requirements/job-management/definition/REQ_get-op.adoc[] + +==== Response + +===== Overview + +include::../requirements/job-management/definition/REQ_response-success.adoc[] + +include::../requirements/job-management/definition/REQ_response-body.adoc[] + +==== Exceptions + +See <> for general guidance. + +If the job with the specified identifier does not exist on the server, see requirement /req/core/job-exception-no-such-job from <>. + diff --git a/extensions/job_management/standard/sections/clause_7_ogcapi-processes.adoc b/extensions/job_management/standard/sections/clause_7_ogcapi-processes.adoc new file mode 100644 index 00000000..8d624b1a --- /dev/null +++ b/extensions/job_management/standard/sections/clause_7_ogcapi-processes.adoc @@ -0,0 +1,37 @@ + +== Requirements Class "OGC API - Process - Workflow Execute Request" + +[[ogcapi-processes-overview]] +=== Overview + +include::../requirements/requirements_class_ogcapi-processes.adoc[] + +This requirements class defines that the OGC API - Process - Workflow Execute Request is supported as an encoding for job definitions. + +=== OGC API - Processes - Workflow Execute Request + +==== Overview + +include::../requirements/ogcapi-processes/REQ_schema.adoc[] + +=== Creating a new job + +==== Request body + +include::../requirements/ogcapi-processes/create/REQ_body.adoc[] + +include::../recommendations/ogcapi-processes/create/PER_content-schema.adoc[] + +=== Updating an existing job + +==== Request body + +include::../requirements/ogcapi-processes/update/REQ_body.adoc[] + +include::../recommendations/ogcapi-processes/update/PER_content-schema.adoc[] + +=== Job definition + +==== Response content + +include::../requirements/ogcapi-processes/definition/REQ_response-body.adoc[] \ No newline at end of file diff --git a/extensions/job_management/standard/sections/clause_8_openeo.adoc b/extensions/job_management/standard/sections/clause_8_openeo.adoc new file mode 100644 index 00000000..67b8eeba --- /dev/null +++ b/extensions/job_management/standard/sections/clause_8_openeo.adoc @@ -0,0 +1,44 @@ + +== Requirements Class "OpenEO Process Graph" + +[[openeo-overview]] +=== Overview + +include::../requirements/requirements_class_openeo.adoc[] + +This requirements class defines that the server supports the OpenEO Process Graph as an encoding for job definitions. + +=== OpenEO Process Graph + +==== Overview + +include::../requirements/openeo/REQ_schema.adoc[] + +[[schema_ogcappkg]] +.link:http://schemas.opengis.net/ogcapi/processes/part4/1.0/openapi/schemas/openeo-process-graph.yaml[Schema for OpenEO Process Graph] +[source,yaml] +---- +include::../../../../openapi/schemas/processes-job-management/openeo-process-graph.yaml[] +---- + +=== Creating a new job + +==== Request body + +include::../requirements/openeo/create/REQ_body.adoc[] + +include::../recommendations/openeo/create/PER_content-schema.adoc[] + +=== Updating an existing job + +==== Request body + +include::../requirements/openeo/update/REQ_body.adoc[] + +include::../recommendations/openeo/update/PER_content-schema.adoc[] + +=== Job definition + +==== Response content + +include::../requirements/openeo/definition/REQ_response-body.adoc[] \ No newline at end of file diff --git a/extensions/job_management/standard/sections/clause_9_provenance.adoc b/extensions/job_management/standard/sections/clause_9_provenance.adoc new file mode 100644 index 00000000..ab3d4e1a --- /dev/null +++ b/extensions/job_management/standard/sections/clause_9_provenance.adoc @@ -0,0 +1,38 @@ +== Requirements Class "Provenance" + +[[provenance-overview]] +=== Overview + +This requirements class defines how to allow client application accessing the provenance of a job run. + +include::../requirements/requirements_class_provenance.adoc[] + +=== Additional endpoints + +==== Inputs + +The server MUST provide an endpoint to retrieve the inputs of a job run. + +===== Operation + +include::../requirements/provenance/inputs/REQ_get-op.adoc[] + +===== Response + +include::../requirements/provenance/inputs/REQ_response.adoc[] + +==== Run + +The server MUST provide an endpoint to retrieve the run of a job. + +===== Operation + +include::../requirements/provenance/run/REQ_get-op.adoc[] + +include::../recommendations/provenance/run/PER_content-negotiation.adoc[] + +===== Response + +include::../requirements/provenance/run/REQ_response.adoc[] + + diff --git a/extensions/job_management/standard/standard.css b/extensions/job_management/standard/standard.css new file mode 100644 index 00000000..8271ec58 --- /dev/null +++ b/extensions/job_management/standard/standard.css @@ -0,0 +1,2134 @@ +/*! normalize.css v2.1.2 | MIT License | git.io/normalize */ +/* ========================================================================== HTML5 display definitions ========================================================================== */ +/** Correct `block` display not defined in IE 8/9. */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block; +} + +/** Correct `inline-block` display not defined in IE 8/9. */ +audio, canvas, video { + display: inline-block; +} + +/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */ +[hidden], template { + display: none; +} + +script { + display: none !important; +} + +/* ========================================================================== Base ========================================================================== */ +/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** Remove default margin. */ +body { + margin: 0; +} + +/* ========================================================================== Links ========================================================================== */ +/** Remove the gray background color from active links in IE 10. */ +a { + background: transparent; +} + +/** Address `outline` inconsistency between Chrome and other browsers. */ +a:focus { + outline: thin dotted; +} + +/** Improve readability when focused and also mouse hovered in all browsers. */ +a:active, a:hover { + outline: 0; +} + +/* ========================================================================== Typography ========================================================================== */ +/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** Address styling not present in IE 8/9, Safari 5, and Chrome. */ +abbr[title] { + border-bottom: 1px dotted; +} + +/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ +b, strong { + font-weight: bold; +} + +/** Address styling not present in Safari 5 and Chrome. */ +dfn { + font-style: italic; +} + +/** Address differences between Firefox and other browsers. */ +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** Address styling not present in IE 8/9. */ +mark { + background: #ff0; + color: #000; +} + +/** Correct font family set oddly in Safari 5 and Chrome. */ +code, kbd, pre, samp { + font-family: monospace, serif; + font-size: 1em; +} + +/** Improve readability of pre-formatted text in all browsers. */ +pre { + white-space: pre-wrap; +} + +/** Set consistent quote types. */ +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +/** Address inconsistent and variable font size in all browsers. */ +small { + font-size: 80%; +} + +/** Address inconsistent and variable font size in all browsers. */ +big { + font-size: 160%; +} + +/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== Embedded content ========================================================================== */ +/** Remove border when inside `a` element in IE 8/9. */ +img { + border: 0; +} + +/** Correct overflow displayed oddly in IE 9. */ +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== Figures ========================================================================== */ +/** Address margin not present in IE 8/9 and Safari 5. */ +figure { + margin: 0; +} + +/* ========================================================================== Forms ========================================================================== */ +/** Define consistent border, margin, and padding. */ +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */ +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */ +button, input, select, textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 2 */ + margin: 0; /* 3 */ +} + +/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ +button, input { + line-height: normal; +} + +/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */ +button, select { + text-transform: none; +} + +/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */ +button, html input[type="button"], input[type="reset"], input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** Re-set default cursor for disabled elements. */ +button[disabled], html input[disabled] { + cursor: default; +} + +/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */ +input[type="checkbox"], input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */ +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */ +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** Remove inner padding and border in Firefox 4+. */ +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */ +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== Tables ========================================================================== */ +/** Remove most spacing between table cells. */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +meta.foundation-mq-small { + font-family: "only screen and (min-width: 768px)"; + width: 768px; +} + +meta.foundation-mq-medium { + font-family: "only screen and (min-width:1280px)"; + width: 1280px; +} + +meta.foundation-mq-large { + font-family: "only screen and (min-width:1440px)"; + width: 1440px; +} + +*, *:before, *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +html, body { + font-size: 100%; +} + +body { + background: white; + color: rgba(0, 0, 0, 0.8); + padding: 0; + margin: 0; + font-family: "Noto Serif", "DejaVu Serif", serif; + font-weight: normal; + font-style: normal; + line-height: 1; + position: relative; + cursor: auto; +} + +a:hover { + cursor: pointer; +} + +img, object, embed { + max-width: 100%; + height: auto; +} + +object, embed { + height: 100%; +} + +img { + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { + max-width: none !important; +} + +.left { + float: left !important; +} + +.right { + float: right !important; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-justify { + text-align: justify !important; +} + +.hide { + display: none; +} + +.antialiased, body { + -webkit-font-smoothing: antialiased; +} + +img { + display: inline-block; + vertical-align: middle; +} + +textarea { + height: auto; + min-height: 50px; +} + +select { + width: 100%; +} + +p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { + font-size: 1.21875em; + line-height: 1.6; +} + +.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { + line-height: 1.45; + color: #000000; + font-weight: normal; + margin-top: 0; + margin-bottom: 0.25em; +} + +/* Typography resets */ +div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { + margin: 0; + padding: 0; + direction: ltr; +} + +/* Default Link Styles */ +a { + color: #2156a5; + text-decoration: underline; + line-height: inherit; +} + +a:hover, a:focus { + color: #1d4b8f; +} + +a img { + border: none; +} + +/* Default paragraph styles */ +p { + font-family: inherit; + font-weight: normal; + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + text-rendering: optimizeLegibility; +} + +p aside { + font-size: 0.875em; + line-height: 1.35; + font-style: italic; +} + +/* Default header styles */ +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + font-family: "Noto Serif", "DejaVu Serif", serif; + font-weight: 300; + font-style: normal; + color: #000000; + text-rendering: optimizeLegibility; + margin-top: 1em; + margin-bottom: 0.5em; + line-height: 1.0125em; +} + +h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { + font-size: 60%; + color: #000000; + line-height: 0; +} + +h1 { + font-size: 160%; +} + +h2 { + font-size: 160%; +} + +h3, #toctitle, .sidebarblock > .content > .title { + font-size: 140%; +} + +h4 { + font-size: 1em; +} + +h5 { + font-size: 1em; +} + +h6 { + font-size: 1em; +} + +hr { + border: solid #ddddd8; + border-width: 1px 0 0; + clear: both; + margin: 1.25em 0 1.1875em; + height: 0; +} + +/* Helpful Typography Defaults */ +em, i { + font-style: italic; + line-height: inherit; +} + +strong, b { + font-weight: bold; + line-height: inherit; +} + +small { + font-size: 60%; + line-height: inherit; +} + +code { + font-family: "Droid Sans Mono", "DejaVu Sans Mono", "Monospace", monospace; + font-weight: normal; + color: rgba(0, 0, 0, 0.9); +} + +/* Lists */ +ul, ol, dl { + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + list-style-position: outside; + font-family: inherit; +} + +ul, ol { + margin-left: 1.5em; +} + +ul.no-bullet, ol.no-bullet { + margin-left: 1.5em; +} + +/* Unordered Lists */ +ul li ul, ul li ol { + margin-left: 1.25em; + margin-bottom: 0; + font-size: 1em; /* Override nested font-size change */ +} + +ul.square li ul, ul.circle li ul, ul.disc li ul { + list-style: inherit; +} + +ul.square { + list-style-type: square; +} + +ul.circle { + list-style-type: circle; +} + +ul.disc { + list-style-type: disc; +} + +ul.no-bullet { + list-style: none; +} + +/* Ordered Lists */ +ol li ul, ol li ol { + margin-left: 1.25em; + margin-bottom: 0; +} + +/* Definition Lists */ +dl dt { + margin-bottom: 0.3125em; + font-weight: bold; +} + +dl dd { + margin-bottom: 1.25em; +} + +/* Abbreviations */ +abbr, acronym { + text-transform: uppercase; + font-size: 90%; + color: rgba(0, 0, 0, 0.8); + border-bottom: 1px dotted #dddddd; + cursor: help; +} + +abbr { + text-transform: none; +} + +/* Blockquotes */ +blockquote { + margin: 0 0 1.25em; + padding: 0.5625em 1.25em 0 1.1875em; + border-left: 1px solid #dddddd; +} + +blockquote cite { + display: block; + font-size: 0.9375em; + color: rgba(0, 0, 0, 0.6); +} + +blockquote cite:before { + content: "\2014 \0020"; +} + +blockquote cite a, blockquote cite a:visited { + color: rgba(0, 0, 0, 0.6); +} + +blockquote, blockquote p { + line-height: 1.6; + color: rgba(0, 0, 0, 0.85); +} + +/* Microformats */ +.vcard { + display: inline-block; + margin: 0 0 1.25em 0; + border: 1px solid #dddddd; + padding: 0.625em 0.75em; +} + +.vcard li { + margin: 0; + display: block; +} + +.vcard .fn { + font-weight: bold; + font-size: 0.9375em; +} + +.vevent .summary { + font-weight: bold; +} + +.vevent abbr { + cursor: auto; + text-decoration: none; + font-weight: bold; + border: none; + padding: 0 0.0625em; +} + +@media only screen and (min-width: 768px) { + h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + font-family: "Noto Serif", "DejaVu Serif", serif; + line-height: 1.2; + font-weight: 300; + font-style: normal; + color: #000000; + text-rendering: optimizeLegibility; + margin-top: 1em; + margin-bottom: 0.5em; + line-height: 1.0125em; + } + + h1 { + font-size: 160%; + font-weight: bold; + } + + h2 { + font-size: 160%; + font-weight: bold; + } + + h3, #toctitle, .sidebarblock > .content > .title { + font-size: 140%; + font-weight: bold; + } + + h4 { + font-size: 1em; + } +} + +/* Tables */ +table { + background: white; + margin-bottom: 1.25em; + border: solid 1px #dedede; +} + +table thead, table tfoot { + background: #f7f8f7; + font-weight: bold; +} + +table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { + padding: 0.5em 0.625em 0.625em; + font-size: inherit; + color: rgba(0, 0, 0, 0.8); + text-align: left; +} + +table tr th, table tr td { + padding: 0.5625em 0.625em; + font-size: inherit; + color: rgba(0, 0, 0, 0.8); +} + +table tr.even, table tr.alt, table tr:nth-of-type(even) { + background: #f8f8f7; +} + +table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { + display: table-cell; + line-height: 1.6; +} + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + line-height: 1.2; + word-spacing: -0.05em; +} + +h1 strong, h2 strong, h3 strong, #toctitle strong, .sidebarblock > .content > .title strong, h4 strong, h5 strong, h6 strong { + font-weight: 400; +} + +.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { + content: " "; + display: table; +} + +.clearfix:after, .float-group:after { + clear: both; +} + +*:not(pre) > code { + font-size: 0.9375em; + font-style: normal !important; + letter-spacing: 0; + padding: 0.1em 0.5ex; + word-spacing: -0.15em; + background-color: #f7f7f8; + -webkit-border-radius: 4px; + border-radius: 4px; + line-height: 1.45; + text-rendering: optimizeSpeed; +} + +pre, pre > code { + line-height: 1.45; + color: rgba(0, 0, 0, 0.9); + font-family: "Droid Sans Mono", "DejaVu Sans Mono", "Monospace", monospace; + font-weight: normal; + text-rendering: optimizeSpeed; +} + +.keyseq { + color: rgba(51, 51, 51, 0.8); +} + +kbd { + display: inline-block; + color: rgba(0, 0, 0, 0.8); + font-size: 0.75em; + line-height: 1.4; + background-color: #f7f7f7; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; + margin: -0.15em 0.15em 0 0.15em; + padding: 0.2em 0.6em 0.2em 0.5em; + vertical-align: middle; + white-space: nowrap; +} + +.keyseq kbd:first-child { + margin-left: 0; +} + +.keyseq kbd:last-child { + margin-right: 0; +} + +.menuseq, .menu { + color: rgba(0, 0, 0, 0.8); +} + +b.button:before, b.button:after { + position: relative; + top: -1px; + font-weight: normal; +} + +b.button:before { + content: "["; + padding: 0 3px 0 2px; +} + +b.button:after { + content: "]"; + padding: 0 2px 0 3px; +} + +p a > code:hover { + color: rgba(0, 0, 0, 0.9); +} + +#header, #content, #footnotes, #footer { + width: 100%; + margin-left: auto; + margin-right: auto; + margin-top: 0; + margin-bottom: 0; + max-width: 62.5em; + *zoom: 1; + position: relative; + padding-left: 0.9375em; + padding-right: 0.9375em; +} + +#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { + content: " "; + display: table; +} + +#header:after, #content:after, #footnotes:after, #footer:after { + clear: both; +} + +#content { + margin-top: 1.25em; +} + +#content:before { + content: none; +} + +#header > h1:first-child { + color: rgba(0, 0, 0, 0.85); + margin-top: 2.25rem; + margin-bottom: 0; +} + +#header > h1:first-child + #toc { + margin-top: 8px; + border-top: 1px solid #ddddd8; +} + +#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { + border-bottom: 1px solid #ddddd8; + padding-bottom: 8px; +} + +#header .details { + border-bottom: 1px solid #ddddd8; + line-height: 1.45; + padding-top: 0.25em; + padding-bottom: 0.25em; + padding-left: 0.25em; + color: rgba(0, 0, 0, 0.6); + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-flow: row wrap; + -webkit-flex-flow: row wrap; + flex-flow: row wrap; +} + +#header .details span:first-child { + margin-left: -0.125em; +} + +#header .details span.email a { + color: rgba(0, 0, 0, 0.85); +} + +#header .details br { + display: none; +} + +#header .details br + span:before { + content: "\00a0\2013\00a0"; +} + +#header .details br + span.author:before { + content: "\00a0\22c5\00a0"; + color: rgba(0, 0, 0, 0.85); +} + +#header .details br + span#revremark:before { + content: "\00a0|\00a0"; +} + +#header #revnumber { + text-transform: capitalize; +} + +#header #revnumber:after { + content: "\00a0"; +} + +#content > h1:first-child:not([class]) { + color: rgba(0, 0, 0, 0.85); + border-bottom: 1px solid #ddddd8; + padding-bottom: 8px; + margin-top: 0; + padding-top: 1rem; + margin-bottom: 1.25rem; +} + +#toc { + border-bottom: 1px solid #efefed; + padding-bottom: 0.5em; +} + +#toc > ul { + margin-left: 0.125em; +} + +#toc ul.sectlevel0 > li > a { + font-style: italic; +} + +#toc ul.sectlevel0 ul.sectlevel1 { + margin: 0.5em 0; +} + +#toc ul { + font-family: "Open Sans", "DejaVu Sans", sans-serif; + list-style-type: none; +} + +#toc a { + text-decoration: none; +} + +#toc a:active { + text-decoration: underline; +} + +#toctitle { + color: #7a2518; + font-size: 1.2em; +} + +@media only screen and (min-width: 768px) { + #toctitle { + font-size: 1.375em; + } + + body.toc2 { + padding-left: 15em; + padding-right: 0; + } + + #toc.toc2 { + margin-top: 0 !important; + background-color: #f8f8f7; + position: fixed; + width: 15em; + left: 0; + top: 0; + border-right: 1px solid #efefed; + border-top-width: 0 !important; + border-bottom-width: 0 !important; + z-index: 1000; + padding: 1.25em 1em; + height: 100%; + overflow: auto; + } + + #toc.toc2 #toctitle { + margin-top: 0; + font-size: 1.2em; + } + + #toc.toc2 > ul { + font-size: 0.9em; + margin-bottom: 0; + } + + #toc.toc2 ul ul { + margin-left: 0; + padding-left: 1em; + } + + #toc.toc2 ul.sectlevel0 ul.sectlevel1 { + padding-left: 0; + margin-top: 0.5em; + margin-bottom: 0.5em; + } + + body.toc2.toc-right { + padding-left: 0; + padding-right: 15em; + } + + body.toc2.toc-right #toc.toc2 { + border-right-width: 0; + border-left: 1px solid #efefed; + left: auto; + right: 0; + } +} + +@media only screen and (min-width: 1280px) { + body.toc2 { + padding-left: 20em; + padding-right: 0; + } + + #toc.toc2 { + width: 20em; + } + + #toc.toc2 #toctitle { + font-size: 1.375em; + } + + #toc.toc2 > ul { + font-size: 0.95em; + } + + #toc.toc2 ul ul { + padding-left: 1.25em; + } + + body.toc2.toc-right { + padding-left: 0; + padding-right: 20em; + } +} + +#content #toc { + border-style: solid; + border-width: 1px; + border-color: #e0e0dc; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f8f8f7; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +#content #toc > :first-child { + margin-top: 0; +} + +#content #toc > :last-child { + margin-bottom: 0; +} + +#footer { + max-width: 100%; + background-color: rgba(0, 0, 0, 0.8); + padding: 1.25em; +} + +#footer-text { + color: rgba(255, 255, 255, 0.8); + line-height: 1.44; +} + +.sect1 { + padding-bottom: 0.625em; +} + +@media only screen and (min-width: 768px) { + .sect1 { + padding-bottom: 1.25em; + } +} + +.sect1 + .sect1 { + border-top: 1px solid #efefed; +} + +#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { + position: absolute; + z-index: 1001; + width: 1.5ex; + margin-left: -1.5ex; + display: block; + text-decoration: none !important; + visibility: hidden; + text-align: center; + font-weight: normal; +} + +#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { + content: "\00A7"; + font-size: 0.85em; + display: block; + padding-top: 0.1em; +} + +#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { + visibility: visible; +} + +#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { + color: #ba3925; + text-decoration: none; +} + +#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { + color: #a53221; +} + +.audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { + margin-bottom: 1.25em; +} + +.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { + text-rendering: optimizeLegibility; + text-align: left; + font-family: "Noto Serif", "DejaVu Serif", serif; + font-size: 1rem; + font-style: italic; +} + +table.tableblock > caption.title { + white-space: nowrap; + overflow: visible; + max-width: 0; +} + +.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { + color: rgba(0, 0, 0, 0.85); +} + +table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { + font-size: inherit; +} + +.admonitionblock > table { + border-collapse: separate; + border: 0; + background: none; + width: 100%; +} + +.admonitionblock > table td.icon { + text-align: center; + width: 80px; +} + +.admonitionblock > table td.icon img { + max-width: none; +} + +.admonitionblock > table td.icon .title { + font-weight: bold; + font-family: "Open Sans", "DejaVu Sans", sans-serif; + text-transform: uppercase; +} + +.admonitionblock > table td.content { + padding-left: 1.125em; + padding-right: 1.25em; + border-left: 1px solid #ddddd8; + color: rgba(0, 0, 0, 0.6); +} + +.admonitionblock > table td.content > :last-child > :last-child { + margin-bottom: 0; +} + +.exampleblock > .content { + border-style: solid; + border-width: 1px; + border-color: #e6e6e6; + margin-bottom: 1.25em; + padding: 1.25em; + background: white; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +.exampleblock > .content > :first-child { + margin-top: 0; +} + +.exampleblock > .content > :last-child { + margin-bottom: 0; +} + +.sidebarblock { + border-style: solid; + border-width: 1px; + border-color: #e0e0dc; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f8f8f7; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +.sidebarblock > :first-child { + margin-top: 0; +} + +.sidebarblock > :last-child { + margin-bottom: 0; +} + +.sidebarblock > .content > .title { + color: #7a2518; + margin-top: 0; + text-align: center; +} + +.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { + margin-bottom: 0; +} + +.literalblock pre, .listingblock pre:not(.highlight), .listingblock pre[class="highlight"], .listingblock pre[class^="highlight "], .listingblock pre.CodeRay, .listingblock pre.prettyprint { + background: #f7f7f8; +} + +.sidebarblock .literalblock pre, .sidebarblock .listingblock pre:not(.highlight), .sidebarblock .listingblock pre[class="highlight"], .sidebarblock .listingblock pre[class^="highlight "], .sidebarblock .listingblock pre.CodeRay, .sidebarblock .listingblock pre.prettyprint { + background: #f2f1f1; +} + +.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { + -webkit-border-radius: 4px; + border-radius: 4px; + word-wrap: break-word; + padding: 1em; + font-size: 0.8125em; +} + +.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { + overflow-x: auto; + white-space: pre; + word-wrap: normal; +} + +@media only screen and (min-width: 768px) { + .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { + font-size: 0.90625em; + } +} + +@media only screen and (min-width: 1280px) { + .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { + font-size: 1em; + } +} + +.literalblock.output pre { + color: #f7f7f8; + background-color: rgba(0, 0, 0, 0.9); +} + +.listingblock pre.highlightjs { + padding: 0; +} + +.listingblock pre.highlightjs > code { + padding: 1em; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +.listingblock pre.prettyprint { + border-width: 0; +} + +.listingblock > .content { + position: relative; +} + +.listingblock code[data-lang]:before { + display: none; + content: attr(data-lang); + position: absolute; + font-size: 0.75em; + top: 0.425rem; + right: 0.5rem; + line-height: 1; + text-transform: uppercase; + color: #999; +} + +.listingblock:hover code[data-lang]:before { + display: block; +} + +.listingblock.terminal pre .command:before { + content: attr(data-prompt); + padding-right: 0.5em; + color: #999; +} + +.listingblock.terminal pre .command:not([data-prompt]):before { + content: "$"; +} + +table.pyhltable { + border-collapse: separate; + border: 0; + margin-bottom: 0; + background: none; +} + +table.pyhltable td { + vertical-align: top; + padding-top: 0; + padding-bottom: 0; +} + +table.pyhltable td.code { + padding-left: .75em; + padding-right: 0; +} + +pre.pygments .lineno, table.pyhltable td:not(.code) { + color: #999; + padding-left: 0; + padding-right: .5em; + border-right: 1px solid #ddddd8; +} + +pre.pygments .lineno { + display: inline-block; + margin-right: .25em; +} + +table.pyhltable .linenodiv { + background: none !important; + padding-right: 0 !important; +} + +.quoteblock { + margin: 0 1em 1.25em 1.5em; + display: table; +} + +.quoteblock > .title { + margin-left: -1.5em; + margin-bottom: 0.75em; +} + +.quoteblock blockquote, .quoteblock blockquote p { + color: rgba(0, 0, 0, 0.85); + font-size: 1.15rem; + line-height: 1.75; + word-spacing: 0.1em; + letter-spacing: 0; + font-style: italic; + text-align: justify; +} + +.quoteblock blockquote { + margin: 0; + padding: 0; + border: 0; +} + +.quoteblock blockquote:before { + content: "\201c"; + float: left; + font-size: 2.75em; + font-weight: bold; + line-height: 0.6em; + margin-left: -0.6em; + color: #7a2518; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.quoteblock blockquote > .paragraph:last-child p { + margin-bottom: 0; +} + +.quoteblock .attribution { + margin-top: 0.5em; + margin-right: 0.5ex; + text-align: right; +} + +.quoteblock .quoteblock { + margin-left: 0; + margin-right: 0; + padding: 0.5em 0; + border-left: 3px solid rgba(0, 0, 0, 0.6); +} + +.quoteblock .quoteblock blockquote { + padding: 0 0 0 0.75em; +} + +.quoteblock .quoteblock blockquote:before { + display: none; +} + +.verseblock { + margin: 0 1em 1.25em 1em; +} + +.verseblock pre { + font-family: "Open Sans", "DejaVu Sans", sans; + font-size: 1.15rem; + color: rgba(0, 0, 0, 0.85); + font-weight: 300; + text-rendering: optimizeLegibility; +} + +.verseblock pre strong { + font-weight: 400; +} + +.verseblock .attribution { + margin-top: 1.25rem; + margin-left: 0.5ex; +} + +.quoteblock .attribution, .verseblock .attribution { + font-size: 0.9375em; + line-height: 1.45; + font-style: italic; +} + +.quoteblock .attribution br, .verseblock .attribution br { + display: none; +} + +.quoteblock .attribution cite, .verseblock .attribution cite { + display: block; + letter-spacing: -0.05em; + color: rgba(0, 0, 0, 0.6); +} + +.quoteblock.abstract { + margin: 0 0 1.25em 0; + display: block; +} + +.quoteblock.abstract blockquote, .quoteblock.abstract blockquote p { + text-align: left; + word-spacing: 0; +} + +.quoteblock.abstract blockquote:before, .quoteblock.abstract blockquote p:first-of-type:before { + display: none; +} + +table.tableblock { + max-width: 100%; + border-collapse: separate; +} + +table.tableblock td > .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { + margin-bottom: 0; +} + +table.spread { + width: 100%; +} + +table.tableblock, th.tableblock, td.tableblock { + border: 0 solid #dedede; +} + +table.grid-all th.tableblock, table.grid-all td.tableblock { + border-width: 0 1px 1px 0; +} + +table.grid-all tfoot > tr > th.tableblock, table.grid-all tfoot > tr > td.tableblock { + border-width: 1px 1px 0 0; +} + +table.grid-cols th.tableblock, table.grid-cols td.tableblock { + border-width: 0 1px 0 0; +} + +table.grid-all * > tr > .tableblock:last-child, table.grid-cols * > tr > .tableblock:last-child { + border-right-width: 0; +} + +table.grid-rows th.tableblock, table.grid-rows td.tableblock { + border-width: 0 0 1px 0; +} + +table.grid-all tbody > tr:last-child > th.tableblock, table.grid-all tbody > tr:last-child > td.tableblock, table.grid-all thead:last-child > tr > th.tableblock, table.grid-rows tbody > tr:last-child > th.tableblock, table.grid-rows tbody > tr:last-child > td.tableblock, table.grid-rows thead:last-child > tr > th.tableblock { + border-bottom-width: 0; +} + +table.grid-rows tfoot > tr > th.tableblock, table.grid-rows tfoot > tr > td.tableblock { + border-width: 1px 0 0 0; +} + +table.frame-all { + border-width: 1px; +} + +table.frame-sides { + border-width: 0 1px; +} + +table.frame-topbot { + border-width: 1px 0; +} + +th.halign-left, td.halign-left { + text-align: left; +} + +th.halign-right, td.halign-right { + text-align: right; +} + +th.halign-center, td.halign-center { + text-align: center; +} + +th.valign-top, td.valign-top { + vertical-align: top; +} + +th.valign-bottom, td.valign-bottom { + vertical-align: bottom; +} + +th.valign-middle, td.valign-middle { + vertical-align: middle; +} + +table thead th, table tfoot th { + font-weight: bold; +} + +tbody tr th { + display: table-cell; + line-height: 1.6; + background: #f7f8f7; +} + +tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { + color: rgba(0, 0, 0, 0.8); + font-weight: bold; +} + +p.tableblock > code:only-child { + background: none; + padding: 0; +} + +p.tableblock { + font-size: 1em; +} + +td > div.verse { + white-space: pre; +} + +ol { + margin-left: 1.75em; +} + +ul li ol { + margin-left: 1.5em; +} + +dl dd { + margin-left: 1.125em; +} + +dl dd:last-child, dl dd:last-child > :last-child { + margin-bottom: 0; +} + +ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { + margin-bottom: 0.625em; +} + +ul.unstyled, ol.unnumbered, ul.checklist, ul.none { + list-style-type: none; +} + +ul.unstyled, ol.unnumbered, ul.checklist { + margin-left: 0.625em; +} + +ul.checklist li > p:first-child > .fa-check-square-o:first-child, ul.checklist li > p:first-child > input[type="checkbox"]:first-child { + margin-right: 0.25em; +} + +ul.checklist li > p:first-child > input[type="checkbox"]:first-child { + position: relative; + top: 1px; +} + +ul.inline { + margin: 0 auto 0.625em auto; + margin-left: -1.375em; + margin-right: 0; + padding: 0; + list-style: none; + overflow: hidden; +} + +ul.inline > li { + list-style: none; + float: left; + margin-left: 1.375em; + display: block; +} + +ul.inline > li > * { + display: block; +} + +.unstyled dl dt { + font-weight: normal; + font-style: normal; +} + +ol.arabic { + list-style-type: decimal; +} + +ol.decimal { + list-style-type: decimal-leading-zero; +} + +ol.loweralpha { + list-style-type: lower-alpha; +} + +ol.upperalpha { + list-style-type: upper-alpha; +} + +ol.lowerroman { + list-style-type: lower-roman; +} + +ol.upperroman { + list-style-type: upper-roman; +} + +ol.lowergreek { + list-style-type: lower-greek; +} + +.hdlist > table, .colist > table { + border: 0; + background: none; +} + +.hdlist > table > tbody > tr, .colist > table > tbody > tr { + background: none; +} + +td.hdlist1 { + padding-right: .75em; + font-weight: bold; +} + +td.hdlist1, td.hdlist2 { + vertical-align: top; +} + +.literalblock + .colist, .listingblock + .colist { + margin-top: -0.5em; +} + +.colist > table tr > td:first-of-type { + padding: 0 0.75em; + line-height: 1; +} + +.colist > table tr > td:last-of-type { + padding: 0.25em 0; +} + +.thumb, .th { + line-height: 0; + display: inline-block; + border: solid 4px white; + -webkit-box-shadow: 0 0 0 1px #dddddd; + box-shadow: 0 0 0 1px #dddddd; +} + +.imageblock.left, .imageblock[style*="float: left"] { + margin: 0.25em 0.625em 1.25em 0; +} + +.imageblock.right, .imageblock[style*="float: right"] { + margin: 0.25em 0 1.25em 0.625em; +} + +.imageblock > .title { + margin-bottom: 0; +} + +.imageblock.thumb, .imageblock.th { + border-width: 6px; +} + +.imageblock.thumb > .title, .imageblock.th > .title { + padding: 0 0.125em; +} + +.image.left, .image.right { + margin-top: 0.25em; + margin-bottom: 0.25em; + display: inline-block; + line-height: 0; +} + +.image.left { + margin-right: 0.625em; +} + +.image.right { + margin-left: 0.625em; +} + +a.image { + text-decoration: none; +} + +span.footnote, span.footnoteref { + vertical-align: super; + font-size: 0.875em; +} + +span.footnote a, span.footnoteref a { + text-decoration: none; +} + +span.footnote a:active, span.footnoteref a:active { + text-decoration: underline; +} + +#footnotes { + padding-top: 0.75em; + padding-bottom: 0.75em; + margin-bottom: 0.625em; +} + +#footnotes hr { + width: 20%; + min-width: 6.25em; + margin: -.25em 0 .75em 0; + border-width: 1px 0 0 0; +} + +#footnotes .footnote { + padding: 0 0.375em; + line-height: 1.3; + font-size: 0.875em; + margin-left: 1.2em; + text-indent: -1.2em; + margin-bottom: .2em; +} + +#footnotes .footnote a:first-of-type { + font-weight: bold; + text-decoration: none; +} + +#footnotes .footnote:last-of-type { + margin-bottom: 0; +} + +#content #footnotes { + margin-top: -0.625em; + margin-bottom: 0; + padding: 0.75em 0; +} + +.gist .file-data > table { + border: 0; + background: #fff; + width: 100%; + margin-bottom: 0; +} + +.gist .file-data > table td.line-data { + width: 99%; +} + +div.unbreakable { + page-break-inside: avoid; +} + +.big { + font-size: x-large; +} + +.small { + font-size: smaller; +} + +.underline { + text-decoration: underline; +} + +.overline { + text-decoration: overline; +} + +.line-through { + text-decoration: line-through; +} + +.aqua { + color: #00bfbf; +} + +.aqua-background { + background-color: #00fafa; +} + +.black { + color: black; +} + +.black-background { + background-color: black; +} + +.blue { + color: #0000bf; +} + +.blue-background { + background-color: #0000fa; +} + +.fuchsia { + color: #bf00bf; +} + +.fuchsia-background { + background-color: #fa00fa; +} + +.gray { + color: #606060; +} + +.gray-background { + background-color: #7d7d7d; +} + +.green { + color: #006000; +} + +.green-background { + background-color: #007d00; +} + +.lime { + color: #00bf00; +} + +.lime-background { + background-color: #00fa00; +} + +.maroon { + color: #600000; +} + +.maroon-background { + background-color: #7d0000; +} + +.navy { + color: #000060; +} + +.navy-background { + background-color: #00007d; +} + +.olive { + color: #606000; +} + +.olive-background { + background-color: #7d7d00; +} + +.purple { + color: #600060; +} + +.purple-background { + background-color: #7d007d; +} + +.red { + color: #bf0000; +} + +.red-background { + background-color: #fa0000; +} + +.silver { + color: #909090; +} + +.silver-background { + background-color: #bcbcbc; +} + +.teal { + color: #006060; +} + +.teal-background { + background-color: #007d7d; +} + +.white { + color: #bfbfbf; +} + +.white-background { + background-color: #fafafa; +} + +.yellow { + color: #bfbf00; +} + +.yellow-background { + background-color: #fafa00; +} + +span.icon > .fa { + cursor: default; +} + +.admonitionblock td.icon [class^="fa icon-"] { + font-size: 2.5em; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); + cursor: default; +} + +.admonitionblock td.icon .icon-note:before { + content: "\f05a"; + color: #19407c; +} + +.admonitionblock td.icon .icon-tip:before { + content: "\f0eb"; + text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); + color: #111; +} + +.admonitionblock td.icon .icon-warning:before { + content: "\f071"; + color: #bf6900; +} + +.admonitionblock td.icon .icon-caution:before { + content: "\f06d"; + color: #bf3400; +} + +.admonitionblock td.icon .icon-important:before { + content: "\f06a"; + color: #bf0000; +} + +.conum[data-value] { + display: inline-block; + color: #fff !important; + background-color: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 100px; + border-radius: 100px; + text-align: center; + font-size: 0.75em; + width: 1.67em; + height: 1.67em; + line-height: 1.67em; + font-family: "Open Sans", "DejaVu Sans", sans-serif; + font-style: normal; + font-weight: bold; +} + +.conum[data-value] * { + color: #fff !important; +} + +.conum[data-value] + b { + display: none; +} + +.conum[data-value]:after { + content: attr(data-value); +} + +pre .conum[data-value] { + position: relative; + top: -0.125em; +} + +b.conum * { + color: inherit !important; +} + +.conum:not([data-value]):empty { + display: none; +} + +h1, h2 { + letter-spacing: -0.01em; +} + +dt, th.tableblock, td.content { + text-rendering: optimizeLegibility; +} + +p, td.content { + letter-spacing: -0.01em; +} + +p strong, td.content strong { + letter-spacing: -0.005em; +} + +p, blockquote, dt, td.content { + font-size: 1.0625rem; +} + +p { + margin-bottom: 1.25rem; +} + +.sidebarblock p, .sidebarblock dt, .sidebarblock td.content, p.tableblock { + font-size: 1em; +} + +.exampleblock > .content { + background-color: #fffef7; + border-color: #e0e0dc; + -webkit-box-shadow: 0 1px 4px #e0e0dc; + box-shadow: 0 1px 4px #e0e0dc; +} + +.print-only { + display: none !important; +} + +@media print { + @page { + margin: 1.25cm 0.75cm; + } + + * { + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; + } + + a { + color: inherit !important; + text-decoration: underline !important; + } + + a.bare, a[href^="#"], a[href^="mailto:"] { + text-decoration: none !important; + } + + a[href^="http:"]:not(.bare):after, a[href^="https:"]:not(.bare):after, a[href^="mailto:"]:not(.bare):after { + content: "(" attr(href) ")"; + display: inline-block; + font-size: 0.875em; + padding-left: 0.25em; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + pre, blockquote, tr, img { + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + img { + max-width: 100% !important; + } + + p, blockquote, dt, td.content { + font-size: 1em; + orphans: 3; + widows: 3; + } + + h2, h3, #toctitle, .sidebarblock > .content > .title, #toctitle, .sidebarblock > .content > .title { + page-break-after: avoid; + } + + #toc, .sidebarblock, .exampleblock > .content { + background: none !important; + } + + #toc { + border-bottom: 1px solid #ddddd8 !important; + padding-bottom: 0 !important; + } + + .sect1 { + padding-bottom: 0 !important; + } + + .sect1 + .sect1 { + border: 0 !important; + } + + #header > h1:first-child { + margin-top: 1.25rem; + } + + body.book #header { + text-align: center; + } + + body.book #header > h1:first-child { + border: 0 !important; + margin: 2.5em 0 1em 0; + } + + body.book #header .details { + border: 0 !important; + display: block; + padding: 0 !important; + } + + body.book #header .details span:first-child { + margin-left: 0 !important; + } + + body.book #header .details br { + display: block; + } + + body.book #header .details br + span:before { + content: none !important; + } + + body.book #toc { + border: 0 !important; + text-align: left !important; + padding: 0 !important; + margin: 0 !important; + } + + body.book #toc, body.book #preamble, body.book h1.sect0, body.book .sect1 > h2 { + page-break-before: always; + } + + .listingblock code[data-lang]:before { + display: block; + } + + #footer { + background: none !important; + padding: 0 0.9375em; + } + + #footer-text { + color: rgba(0, 0, 0, 0.6) !important; + font-size: 0.9em; + } + + .hide-on-print { + display: none !important; + } + + .print-only { + display: block !important; + } + + .hide-for-print { + display: none !important; + } + + .show-for-print { + display: inherit !important; + } +} diff --git a/extensions/job_management/xml/README.md b/extensions/job_management/xml/README.md new file mode 100644 index 00000000..f1ab5dec --- /dev/null +++ b/extensions/job_management/xml/README.md @@ -0,0 +1 @@ +XML stuff goes here! diff --git a/openapi/paths/processes-job-management/pJob.yaml b/openapi/paths/processes-job-management/pJob.yaml new file mode 100644 index 00000000..d5b3f12a --- /dev/null +++ b/openapi/paths/processes-job-management/pJob.yaml @@ -0,0 +1,53 @@ +patch: + summary: update a job. + description: | + Update a job resulting in the creation of a job resource. + operationId: updateJob + tags: + - Jobs Management + parameters: + - $ref: "../../parameters/processes-core/jobId.yaml" + # If we want to use similar mechanism as the workflows, we can use the + # following parameter. + #- $ref: "../../parameters/processes-workflows/response.yaml" + # If we want to use similar mechanism as in the Part 1, we can use the + # following parameter. + #- $ref: "../../parameters/processes-core/prefer-header-execution.yaml" + requestBody: + description: An execution request specifying any inputs for the process to execute, and optionally to select specific outputs. + required: true + content: + application/json: + schema: + $ref: "../../schemas/processes-workflows/execute-workflows.yaml" + responses: + # In case we do not agree to force asynchornous mode for the /jobs + # endpoint, we can also use the following response. + #200: + # $ref: "../../responses/processes-core/rExecuteSync.yaml" + 201: + $ref: "../../responses/processes-core/rExecuteAsync.yaml" + # If the Server Implementation support the Collection output conformance class. + #303: + # $ref: "../../responses/processes-workflows/rExecuteCollectionRedirect.yaml" + 404: + $ref: "../../responses/common-core/rNotFound.yaml" + 422: + $ref: "../../responses/common-core/rUnprocessableEntity.yaml" + 423: + $ref: "../../responses/common-core/rLocked.yaml" + 500: + $ref: "../../responses/common-core/rServerError.yaml" + callbacks: + # Where are the other callbacks (ie. jobFailed, jobUpdated)? + jobCompleted: + "{$request.body#/subscriber/successUri}": + post: + requestBody: + content: + application/json: + schema: + $ref: "../../schemas/processes-core/results.yaml" + responses: + 200: + description: Results received successfully diff --git a/openapi/paths/processes-job-management/pJobDefinition.yaml b/openapi/paths/processes-job-management/pJobDefinition.yaml new file mode 100644 index 00000000..ef2c5b2e --- /dev/null +++ b/openapi/paths/processes-job-management/pJobDefinition.yaml @@ -0,0 +1,16 @@ +get: + summary: retrieve the definition of a job + description: | + Retrieve the definition of a job. + operationId: getJobDefinition + tags: + - Jobs Management + parameters: + - $ref: "../../parameters/processes-core/jobId.yaml" + responses: + 200: + $ref: "../../schemas/processes-workflows/execute-workflows.yaml" + 404: + $ref: "../../responses/common-core/rNotFound.yaml" + 500: + $ref: "../../responses/common-core/rServerError.yaml" diff --git a/openapi/paths/processes-job-management/pJobInputs.yaml b/openapi/paths/processes-job-management/pJobInputs.yaml new file mode 100644 index 00000000..96ef8b02 --- /dev/null +++ b/openapi/paths/processes-job-management/pJobInputs.yaml @@ -0,0 +1,16 @@ +get: + summary: retrieve the information about a job + description: | + Retrieve the information about a job. + operationId: getJobInputs + tags: + - Jobs Management + parameters: + - $ref: "../../parameters/processes-core/jobId.yaml" + responses: + 200: + $ref: "../../schemas/processes-management/rInputs.yaml" + 404: + $ref: "../../responses/common-core/rNotFound.yaml" + 500: + $ref: "../../responses/common-core/rServerError.yaml" diff --git a/openapi/paths/processes-job-management/pJobResults.yaml b/openapi/paths/processes-job-management/pJobResults.yaml new file mode 100644 index 00000000..a5baeab6 --- /dev/null +++ b/openapi/paths/processes-job-management/pJobResults.yaml @@ -0,0 +1,24 @@ +post: + summary: start the executino of a job + description: | + Starts the execution of a job. + operationId: postResult + requestBody: + description: An empty body. + required: true + content: + application/json: + schema: + type: object + nullable: true + tags: + - Jobs Management + parameters: + - $ref: "../../parameters/processes-core/jobId.yaml" + responses: + 200: + $ref: "../../responses/processes-core/rExecuteAsync.yaml" + 404: + $ref: "../../responses/common-core/rNotFound.yaml" + 500: + $ref: "../../responses/common-core/rServerError.yaml" diff --git a/openapi/paths/processes-job-management/pJobsList.yaml b/openapi/paths/processes-job-management/pJobsList.yaml new file mode 100644 index 00000000..8c10ae06 --- /dev/null +++ b/openapi/paths/processes-job-management/pJobsList.yaml @@ -0,0 +1,50 @@ +post: + summary: create a job. + description: | + Create a job resulting in the creation of a job resource. + operationId: createJob + tags: + - Jobs Management + parameters: + # If we want to use similar mechanism as the workflows, we can use the + # following parameter. + #- $ref: "../../parameters/processes-workflows/response.yaml" + # If we want to use similar mechanism as in the Part 1, we can use the + # following parameter. + #- $ref: "../../parameters/processes-core/prefer-header-execution.yaml" + requestBody: + description: An execution request specifying any inputs for the process to execute, and optionally to select specific outputs. + required: true + content: + application/json: + schema: + $ref: "../../schemas/processes-workflows/execute-workflows.yaml" + responses: + # In case we do not agree to force asynchornous mode for the /jobs + # endpoint, we can also use the following response. + #200: + # $ref: "../../responses/processes-core/rExecuteSync.yaml" + 201: + $ref: "../../responses/processes-core/rExecuteAsync.yaml" + # If the Server Implementation support the Collection output conformance class. + #303: + # $ref: "../../responses/processes-workflows/rExecuteCollectionRedirect.yaml" + 404: + $ref: "../../responses/common-core/rNotFound.yaml" + 422: + $ref: "../../responses/common-core/rUnprocessableEntity.yaml" + 500: + $ref: "../../responses/common-core/rServerError.yaml" + callbacks: + # Where are the other callbacks (ie. jobFailed, jobUpdated)? + jobCompleted: + "{$request.body#/subscriber/successUri}": + post: + requestBody: + content: + application/json: + schema: + $ref: "../../schemas/processes-core/results.yaml" + responses: + 200: + description: Results received successfully diff --git a/openapi/responses/processes-job-management/rInputs.yaml b/openapi/responses/processes-job-management/rInputs.yaml new file mode 100644 index 00000000..e80203a8 --- /dev/null +++ b/openapi/responses/processes-job-management/rInputs.yaml @@ -0,0 +1,8 @@ +description: Proivenance information about a job. +content: + application/json: + schema: + $ref: '../../schemas/processes-job-management/inputs.yaml' + text/html: + schema: + type: string diff --git a/openapi/responses/processes-job-management/rLocked.yaml b/openapi/responses/processes-job-management/rLocked.yaml new file mode 100644 index 00000000..c015d651 --- /dev/null +++ b/openapi/responses/processes-job-management/rLocked.yaml @@ -0,0 +1,8 @@ +description: Job is locked. For example, the `status` of the job is currently something else than `succeeded`, `failed` and `created`. +content: + application/json: + schema: + $ref: '../../schemas/common-core/exception.yaml' + text/html: + schema: + type: string diff --git a/openapi/responses/processes-job-management/rUnsupportedSchema.yaml b/openapi/responses/processes-job-management/rUnsupportedSchema.yaml new file mode 100644 index 00000000..2c080eef --- /dev/null +++ b/openapi/responses/processes-job-management/rUnsupportedSchema.yaml @@ -0,0 +1,8 @@ +description: Unprocessable Content. For example, the `Content-Schema` header submitted in the request did not support any of schemas supported by the server for the requested resource. +content: + application/json: + schema: + $ref: '../../schemas/common-core/exception.yaml' + text/html: + schema: + type: string diff --git a/openapi/schemas/processes-core/statusCode.yaml b/openapi/schemas/processes-core/statusCode.yaml index f30262c9..8c6a6850 100644 --- a/openapi/schemas/processes-core/statusCode.yaml +++ b/openapi/schemas/processes-core/statusCode.yaml @@ -3,6 +3,6 @@ nullable: false enum: - accepted - running - - successful + - succeeded - failed - dismissed diff --git a/openapi/schemas/processes-core/statusInfo.yaml b/openapi/schemas/processes-core/statusInfo.yaml index 31afed5e..85e4eb3e 100644 --- a/openapi/schemas/processes-core/statusInfo.yaml +++ b/openapi/schemas/processes-core/statusInfo.yaml @@ -1,17 +1,19 @@ type: object required: - - jobID + - id - status - type properties: + id: + type: string processID: type: string type: type: string - enum: + example: - process - jobID: - type: string + - wps + - openeo status: $ref: "statusCode.yaml" message: diff --git a/openapi/schemas/processes-job-management/inputs.yaml b/openapi/schemas/processes-job-management/inputs.yaml new file mode 100644 index 00000000..88701fe2 --- /dev/null +++ b/openapi/schemas/processes-job-management/inputs.yaml @@ -0,0 +1,21 @@ +type: object +required: + - inputs + - outputs +properties: + inputs: + type: object + additionalProperties: + $ref: "../processes-workflow/input-workflow.yaml" + outputs: + type: object + additionalProperties: + $ref: "../processes-workflow/output-workflow.yaml" + links: + type: array + items: + $ref: "../common-core/link.yaml" + metadata: + type: array + items: + $ref: "../processes-core/metadata.yaml" diff --git a/openapi/schemas/processes-job-management/jobList.yaml b/openapi/schemas/processes-job-management/jobList.yaml new file mode 100644 index 00000000..6791b0d0 --- /dev/null +++ b/openapi/schemas/processes-job-management/jobList.yaml @@ -0,0 +1,13 @@ +type: object +required: + - jobs + - links +properties: + jobs: + type: array + items: + $ref: "statusInfo.yaml" + links: + type: array + items: + $ref: "../common-core/link.yaml" diff --git a/openapi/schemas/processes-job-management/openeo-process-graph.yaml b/openapi/schemas/processes-job-management/openeo-process-graph.yaml new file mode 100644 index 00000000..ff4cbf18 --- /dev/null +++ b/openapi/schemas/processes-job-management/openeo-process-graph.yaml @@ -0,0 +1,10 @@ +type: object +additionalProperties: + type: object + required: + - process_id + - arguments + properties: + process_id: + type: string + arguments: {} diff --git a/openapi/schemas/processes-job-management/processes-type.yaml b/openapi/schemas/processes-job-management/processes-type.yaml new file mode 100644 index 00000000..8a6f399f --- /dev/null +++ b/openapi/schemas/processes-job-management/processes-type.yaml @@ -0,0 +1,5 @@ +type: string +nullable: false +enum: + - process + - openeo diff --git a/openapi/schemas/processes-job-management/statusCode.yaml b/openapi/schemas/processes-job-management/statusCode.yaml new file mode 100644 index 00000000..e5c61562 --- /dev/null +++ b/openapi/schemas/processes-job-management/statusCode.yaml @@ -0,0 +1,9 @@ +type: string +nullable: false +enum: + - created + - accepted + - running + - succeeded + - failed + - dismissed diff --git a/openapi/schemas/processes-job-management/statusInfo.yaml b/openapi/schemas/processes-job-management/statusInfo.yaml new file mode 100644 index 00000000..4f9accfd --- /dev/null +++ b/openapi/schemas/processes-job-management/statusInfo.yaml @@ -0,0 +1,38 @@ +type: object +required: + - id + - status + - type +properties: + id: + type: string + process: + type: string + type: + $ref: "processes-type.yaml" + status: + $ref: "statusCode.yaml" + message: + type: string + exception: + $ref: "../common-core/exception.yaml" + created: + type: string + format: date-time + started: + type: string + format: date-time + finished: + type: string + format: date-time + updated: + type: string + format: date-time + progress: + type: integer + minimum: 0 + maximum: 100 + links: + type: array + items: + $ref: "../common-core/link.yaml"