mirror of
https://github.com/ansible/awx.git
synced 2026-05-19 14:57:39 -02:30
Publish open api spec on AWX for community use (#16221)
* Added link and ref to openAPI spec for community * Update docs/docsite/rst/contributor/openapi_link.rst Co-authored-by: Don Naro <dnaro@redhat.com> * add sphinxcontrib-redoc to requirements * sphinxcontrib.redoc configuration * create openapi directory and files * update download script for both schema files * suppress warning for redoc * update labels * fix extra closing parenthesis * update schema url * exclude doc config and download script The Sphinx configuration (conf.py) and schema download script (download-json.py) are not application logic and used only for building documentation. Coverage requirements for these files are overkill. * exclude only the sphinx config file --------- Co-authored-by: Don Naro <dnaro@redhat.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import shlex
|
import shlex
|
||||||
|
import warnings
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
@@ -8,10 +9,10 @@ from importlib import import_module
|
|||||||
sys.path.insert(0, os.path.abspath('./rst/rest_api/_swagger'))
|
sys.path.insert(0, os.path.abspath('./rst/rest_api/_swagger'))
|
||||||
|
|
||||||
project = u'Ansible AWX'
|
project = u'Ansible AWX'
|
||||||
copyright = u'2024, Red Hat'
|
copyright = u'2026, Red Hat'
|
||||||
author = u'Red Hat'
|
author = u'Red Hat'
|
||||||
|
|
||||||
pubdateshort = '2024-11-22'
|
pubdateshort = '2026-01-07'
|
||||||
pubdate = datetime.strptime(pubdateshort, '%Y-%m-%d').strftime('%B %d, %Y')
|
pubdate = datetime.strptime(pubdateshort, '%Y-%m-%d').strftime('%B %d, %Y')
|
||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
@@ -35,6 +36,7 @@ extensions = [
|
|||||||
'sphinx.ext.coverage',
|
'sphinx.ext.coverage',
|
||||||
'sphinx.ext.ifconfig',
|
'sphinx.ext.ifconfig',
|
||||||
'sphinx_ansible_theme',
|
'sphinx_ansible_theme',
|
||||||
|
'sphinxcontrib.redoc',
|
||||||
'notfound.extension',
|
'notfound.extension',
|
||||||
'swagger',
|
'swagger',
|
||||||
]
|
]
|
||||||
@@ -61,6 +63,27 @@ language = 'en'
|
|||||||
locale_dirs = ['locale/'] # path is example but recommended.
|
locale_dirs = ['locale/'] # path is example but recommended.
|
||||||
gettext_compact = False # optional.
|
gettext_compact = False # optional.
|
||||||
|
|
||||||
|
redoc = [
|
||||||
|
{
|
||||||
|
'name': 'AWX OpenAPI Reference',
|
||||||
|
'page': 'open_api/explorer',
|
||||||
|
'spec': 'rst/open_api/schema.json',
|
||||||
|
'embed': True,
|
||||||
|
'opts': {
|
||||||
|
'suppress-warnings': True,
|
||||||
|
'hide-hostname': True,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
# Suppress pkg_resources deprecation from sphinxcontrib-redoc
|
||||||
|
warnings.filterwarnings(
|
||||||
|
'ignore',
|
||||||
|
message='pkg_resources is deprecated',
|
||||||
|
category=UserWarning,
|
||||||
|
module='sphinxcontrib.redoc',
|
||||||
|
)
|
||||||
|
|
||||||
rst_epilog = """
|
rst_epilog = """
|
||||||
.. |atapi| replace:: *AWX API Guide*
|
.. |atapi| replace:: *AWX API Guide*
|
||||||
.. |atrn| replace:: *AWX Release Notes*
|
.. |atrn| replace:: *AWX Release Notes*
|
||||||
@@ -89,3 +112,4 @@ rst_epilog = """
|
|||||||
pubdateshort,
|
pubdateshort,
|
||||||
pubdate,
|
pubdate,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
19
docs/docsite/download-json.py
Normal file
19
docs/docsite/download-json.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import requests
|
||||||
|
|
||||||
|
downloads = [
|
||||||
|
{"url": "https://awx-public-ci-files.s3.amazonaws.com/community-docs/swagger.json", "path": "./docs/docsite/rst/rest_api/_swagger/swagger.json"},
|
||||||
|
{"url": "https://s3.amazonaws.com/awx-public-ci-files/awx/devel/schema.json", "path": "./docs/docsite/rst/open_api/schema.json"},
|
||||||
|
]
|
||||||
|
|
||||||
|
for item in downloads:
|
||||||
|
url = item["url"]
|
||||||
|
filepath = item["path"]
|
||||||
|
|
||||||
|
response = requests.get(url)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
with open(filepath, 'wb') as file:
|
||||||
|
file.write(response.content)
|
||||||
|
print(f"JSON file downloaded to {filepath}")
|
||||||
|
else:
|
||||||
|
print(f"Request failed with status code: {response.status_code}")
|
||||||
@@ -3,6 +3,8 @@
|
|||||||
sphinx # Tooling to build HTML from RST source.
|
sphinx # Tooling to build HTML from RST source.
|
||||||
sphinx-ansible-theme # Ansible community theme for Sphinx doc builds.
|
sphinx-ansible-theme # Ansible community theme for Sphinx doc builds.
|
||||||
sphinx-notfound-page # Sphinx extension for custom 404 page.
|
sphinx-notfound-page # Sphinx extension for custom 404 page.
|
||||||
|
sphinxcontrib-redoc # Renders OpenAPI spec in human readable format.
|
||||||
|
setuptools >= 65.0 # Provides pkg_resources module for compatibility. Needed by sphinxcontrib-redoc.
|
||||||
docutils # Tooling for RST processing and the swagger extension.
|
docutils # Tooling for RST processing and the swagger extension.
|
||||||
Jinja2 # Requires investigation. Possibly inherited from previous repo with a custom theme.
|
Jinja2 # Requires investigation. Possibly inherited from previous repo with a custom theme.
|
||||||
PyYaml # Requires investigation. Possibly used as tooling for swagger API reference content.
|
PyYaml # Requires investigation. Possibly used as tooling for swagger API reference content.
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ alabaster==1.0.0
|
|||||||
# via sphinx
|
# via sphinx
|
||||||
ansible-pygments==0.1.1
|
ansible-pygments==0.1.1
|
||||||
# via sphinx-ansible-theme
|
# via sphinx-ansible-theme
|
||||||
|
attrs==25.4.0
|
||||||
|
# via
|
||||||
|
# jsonschema
|
||||||
|
# referencing
|
||||||
babel==2.16.0
|
babel==2.16.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
certifi==2024.8.30
|
certifi==2024.8.30
|
||||||
@@ -27,6 +31,11 @@ jinja2==3.1.4
|
|||||||
# via
|
# via
|
||||||
# -r docs/docsite/requirements.in
|
# -r docs/docsite/requirements.in
|
||||||
# sphinx
|
# sphinx
|
||||||
|
# sphinxcontrib-redoc
|
||||||
|
jsonschema==4.26.0
|
||||||
|
# via sphinxcontrib-redoc
|
||||||
|
jsonschema-specifications==2025.9.1
|
||||||
|
# via jsonschema
|
||||||
markupsafe==3.0.2
|
markupsafe==3.0.2
|
||||||
# via jinja2
|
# via jinja2
|
||||||
packaging==24.2
|
packaging==24.2
|
||||||
@@ -36,9 +45,21 @@ pygments==2.18.0
|
|||||||
# ansible-pygments
|
# ansible-pygments
|
||||||
# sphinx
|
# sphinx
|
||||||
pyyaml==6.0.2
|
pyyaml==6.0.2
|
||||||
# via -r docs/docsite/requirements.in
|
# via
|
||||||
|
# -r docs/docsite/requirements.in
|
||||||
|
# sphinxcontrib-redoc
|
||||||
|
referencing==0.37.0
|
||||||
|
# via
|
||||||
|
# jsonschema
|
||||||
|
# jsonschema-specifications
|
||||||
requests==2.32.3
|
requests==2.32.3
|
||||||
# via sphinx
|
# via sphinx
|
||||||
|
rpds-py==0.30.0
|
||||||
|
# via
|
||||||
|
# jsonschema
|
||||||
|
# referencing
|
||||||
|
six==1.17.0
|
||||||
|
# via sphinxcontrib-redoc
|
||||||
snowballstemmer==2.2.0
|
snowballstemmer==2.2.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinx==8.1.3
|
sphinx==8.1.3
|
||||||
@@ -48,6 +69,7 @@ sphinx==8.1.3
|
|||||||
# sphinx-notfound-page
|
# sphinx-notfound-page
|
||||||
# sphinx-rtd-theme
|
# sphinx-rtd-theme
|
||||||
# sphinxcontrib-jquery
|
# sphinxcontrib-jquery
|
||||||
|
# sphinxcontrib-redoc
|
||||||
sphinx-ansible-theme==0.10.3
|
sphinx-ansible-theme==0.10.3
|
||||||
# via -r docs/docsite/requirements.in
|
# via -r docs/docsite/requirements.in
|
||||||
sphinx-notfound-page==1.0.4
|
sphinx-notfound-page==1.0.4
|
||||||
@@ -66,7 +88,15 @@ sphinxcontrib-jsmath==1.0.1
|
|||||||
# via sphinx
|
# via sphinx
|
||||||
sphinxcontrib-qthelp==2.0.0
|
sphinxcontrib-qthelp==2.0.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
|
sphinxcontrib-redoc==1.6.0
|
||||||
|
# via -r docs/docsite/requirements.in
|
||||||
sphinxcontrib-serializinghtml==2.0.0
|
sphinxcontrib-serializinghtml==2.0.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
|
typing-extensions==4.15.0
|
||||||
|
# via referencing
|
||||||
urllib3==2.2.3
|
urllib3==2.2.3
|
||||||
# via requests
|
# via requests
|
||||||
|
|
||||||
|
# The following packages are considered to be unsafe in a requirements file:
|
||||||
|
setuptools==80.9.0
|
||||||
|
# via -r docs/docsite/requirements.in
|
||||||
|
|||||||
@@ -18,9 +18,11 @@ Ansible AWX helps teams manage complex multi-tier deployments by adding control,
|
|||||||
contributor/DJANGO_REQUIREMENTS
|
contributor/DJANGO_REQUIREMENTS
|
||||||
contributor/API_REQUIREMENTS
|
contributor/API_REQUIREMENTS
|
||||||
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
:caption: Developers
|
:caption: Developers
|
||||||
|
|
||||||
rest_api/index
|
rest_api/index
|
||||||
|
open_api/index
|
||||||
|
|
||||||
|
|||||||
1
docs/docsite/rst/open_api/explorer.rst
Normal file
1
docs/docsite/rst/open_api/explorer.rst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
:orphan:
|
||||||
10
docs/docsite/rst/open_api/index.rst
Normal file
10
docs/docsite/rst/open_api/index.rst
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
===================
|
||||||
|
AWX OpenAPI Schema
|
||||||
|
===================
|
||||||
|
|
||||||
|
This document describes the OpenAPI 3.0.3 specification for the AWX API (version v2).
|
||||||
|
|
||||||
|
This schema serves as the complete API documentation and contract for interacting programmatically with AWX, which is used for managing Ansible automation workflows, inventories, credentials, and job execution.
|
||||||
|
|
||||||
|
* `Explore the AWX OpenAPI Schema <explorer.html>`_
|
||||||
|
* `Download the AWX OpenAPI Schema <https://s3.amazonaws.com/awx-public-ci-files/awx/devel/schema.json>`_
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import requests
|
|
||||||
|
|
||||||
url = "https://awx-public-ci-files.s3.amazonaws.com/community-docs/swagger.json"
|
|
||||||
swagger_json = "./docs/docsite/rst/rest_api/_swagger/swagger.json"
|
|
||||||
|
|
||||||
response = requests.get(url)
|
|
||||||
|
|
||||||
if response.status_code == 200:
|
|
||||||
with open(swagger_json, 'wb') as file:
|
|
||||||
file.write(response.content)
|
|
||||||
print(f"JSON file downloaded to {swagger_json}")
|
|
||||||
else:
|
|
||||||
print(f"Request failed with status code: {response.status_code}")
|
|
||||||
@@ -77,7 +77,9 @@ sonar.exclusions=\
|
|||||||
**/*.pyd,\
|
**/*.pyd,\
|
||||||
**/build/**,\
|
**/build/**,\
|
||||||
**/dist/**,\
|
**/dist/**,\
|
||||||
**/*.egg-info/**
|
**/*.egg-info/**,\
|
||||||
|
**/download-json.py,\
|
||||||
|
docs/docsite/conf.py
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# COVERAGE EXCLUSIONS
|
# COVERAGE EXCLUSIONS
|
||||||
|
|||||||
2
tox.ini
2
tox.ini
@@ -36,5 +36,5 @@ deps =
|
|||||||
-r{toxinidir}/docs/docsite/requirements.in
|
-r{toxinidir}/docs/docsite/requirements.in
|
||||||
-c{toxinidir}/docs/docsite/requirements.txt
|
-c{toxinidir}/docs/docsite/requirements.txt
|
||||||
commands =
|
commands =
|
||||||
python {toxinidir}/docs/docsite/rst/rest_api/_swagger/download-json.py
|
python {toxinidir}/docs/docsite/download-json.py
|
||||||
sphinx-build -T -E -W -n --keep-going {tty:--color} -j auto -c docs/docsite -d docs/docsite/build/doctrees -b html docs/docsite/rst docs/docsite/build/html
|
sphinx-build -T -E -W -n --keep-going {tty:--color} -j auto -c docs/docsite -d docs/docsite/build/doctrees -b html docs/docsite/rst docs/docsite/build/html
|
||||||
|
|||||||
Reference in New Issue
Block a user