Skip to content

feat: improve API-ref extraction quality and coverage in the RAG#83

Open
omkarjoshi0304 wants to merge 6 commits into
openstack-lightspeed:mainfrom
omkarjoshi0304:OSPRH-19255-api-ref
Open

feat: improve API-ref extraction quality and coverage in the RAG#83
omkarjoshi0304 wants to merge 6 commits into
openstack-lightspeed:mainfrom
omkarjoshi0304:OSPRH-19255-api-ref

Conversation

@omkarjoshi0304
Copy link
Copy Markdown
Contributor

@omkarjoshi0304 omkarjoshi0304 commented Jan 14, 2026

Description:-

This PR improves the quality of API reference data ingested into the RAG pipeline and ensures consistent coverage across OpenStack 2025.2 projects.

Use pandoc + html2text for cleaner API extraction (removes nav, headers, and boilerplate)

Apply heuristic filtering to index.txt files to keep meaningful single-page APIs and drop navigation-only indices

Auto-detect api-ref and api-guide sources to avoid missing project docs

Filter out placeholder/junk files using logo metadata detection

Summary by CodeRabbit

  • Chores
    • Pinned a specific Pandoc release in the docs build.
    • Removed an unused plain-text conversion dependency.
    • Made API-Ref source selection dynamic and adjusted build/copy targets accordingly.
    • Converted API-Ref HTML→text with Pandoc and tightened post-build cleanup.
    • Fail-fast on API-Ref build errors and refined generated documentation URL mapping.

@omkarjoshi0304 omkarjoshi0304 requested a review from a team as a code owner January 14, 2026 16:15
@omkarjoshi0304 omkarjoshi0304 marked this pull request as draft January 14, 2026 16:40
@omkarjoshi0304 omkarjoshi0304 marked this pull request as ready for review January 14, 2026 18:50
Copy link
Copy Markdown
Contributor

@Akrog Akrog left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As a rule the source of truth is the git repository, so we should try to include as much information as possible in the commit message.

In this case I see there is more information on the PR description than the commit message itself.

Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
if [ "$OS_API_DOCS" = "true" ] && [ -d "./api-ref/source" ]; then
if ! grep -q "text-api-ref" tox.ini; then
echo "$tox_text_api_ref_target" >> tox.ini
# Build API-Ref
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Why remote the "if enabled" part of the comment?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My bad i accidentally removed it

Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
text_file="./$api_dir/build/text/${rel_path%.html}.txt"
mkdir -p "$(dirname "$text_file")"

if command -v pandoc &> /dev/null; then
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure it's a good idea to allow building things with 2 different tools, as they would create different outputs, so we may start having different DB contents and not realize. This would make it harder to find out WHY things don't behave like they did beefore.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have removed the html2text fallback and standardized on Pandoc only.
The reasoning is that Pandoc produces significantly better structural output (especially for tables and code blocks) compared to html2text

Comment thread scripts/get_openstack_plaintext_docs.sh Outdated

if command -v pandoc &> /dev/null; then
# shellcheck disable=SC2015
pandoc -f html -t plain --wrap=preserve "$html_file" -o "$text_file" 2>/dev/null && ((converted_count++)) || true
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is it OK for conversion to fail?
This could hide problems with the process.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed the || true safety net. The script will now fail explicitly if a file cannot be converted, preventing us from silently indexing corrupted or missing data.

Comment thread scripts/get_openstack_plaintext_docs.sh
Comment thread scripts/get_openstack_plaintext_docs.sh Outdated

if [ "$api_file_count" -gt 0 ]; then
echo "API-Ref: Found $api_file_count content files for $project"
# Only remove index.txt if other content files exist
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't find this comment very helpful. I can see in the code at a glance that's what is happening, but it's not explained WHY we are deleting it. For example because when there are other files index.txt is a navigation page pointing to other pages, so we don't want it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have updated the comment

Comment thread scripts/get_openstack_plaintext_docs.sh
@omkarjoshi0304
Copy link
Copy Markdown
Contributor Author

As a rule the source of truth is the git repository, so we should try to include as much information as possible in the commit message.

In this case I see there is more information on the PR description than the commit message itself.

Thanks for addressing i will edit the commit message

@omkarjoshi0304 omkarjoshi0304 force-pushed the OSPRH-19255-api-ref branch 2 times, most recently from 42f3a1d to ce60cfb Compare January 17, 2026 02:15
Copy link
Copy Markdown
Contributor

@lpiwowar lpiwowar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just two comments that crossed my mind this morning.

Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
@omkarjoshi0304 omkarjoshi0304 force-pushed the OSPRH-19255-api-ref branch 2 times, most recently from 951ea86 to 212b8ed Compare January 21, 2026 03:41
# Replace .txt with .html
remaining_path = remaining_path.replace(".txt", ".html")

# Build API-Ref URL: /api-ref/{service}/{remaining_path}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: The path in the comment doesn't look too useful to me. In my opinion the actual path doesn't add value since we can see it very clearly on the next line.
It is even misleading, as it has {service} but then we use {service_name}.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have removed it

Comment thread scripts/get_openstack_plaintext_docs.sh
Comment thread scripts/get_openstack_plaintext_docs.sh
Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
find ./api-ref/build/text -mindepth 1 -depth -type d -empty -delete 2>/dev/null || true
if ! tox -etext-api-ref; then
echo "WARNING: API-Ref build failed for $project"
api_ref_failed="true"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-1: Why don't we fail the process if we fail to build the api-ref?
Wouldn't this hide errors?
I think we should fail, but maybe I'm missing something.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated it to exit 1

Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
[ -d "doc/build/text" ] && cp -r doc/build/text "$project_output_dir"/"$_output_version"_docs
# Copy regular docs if they were built (not for neutron-lib)
if [ -d "doc/build/text" ]; then
cp -r doc/build/text "$project_output_dir"/"$_output_version"_docs
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Why multiple double quotes? `"${project_output_dir}/${_output_version}_docs"

Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
# Copy API-Ref documentation if it was built successfully
if [ "$OS_API_DOCS" = "true" ] && [ "$api_ref_failed" != "true" ] && \
[ -n "$api_dir" ] && [ -d "$api_dir/build/text" ]; then
cp -r "$api_dir/build/text" "$project_output_dir"/"$_output_version"_api-ref
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Same here about multiple double quotes

umago
umago previously approved these changes Feb 6, 2026
Copy link
Copy Markdown
Contributor

@umago umago left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume many part of bash scripting code has been AI generated ? I don't necessarily understand all of the commands there but the logic seems OK.

Assuming this has been tested and works I'm OK with it as we already have other parts of the code that has been assisted as well/.

Comment thread scripts/get_openstack_plaintext_docs.sh
@omkarjoshi0304
Copy link
Copy Markdown
Contributor Author

I assume many part of bash scripting code has been AI generated ? I don't necessarily understand all of the commands there but the logic seems OK.

Assuming this has been tested and works I'm OK with it as we already have other parts of the code that has been assisted as well/.

I assume many part of bash scripting code has been AI generated ? I don't necessarily understand all of the commands there but the logic seems OK.

Assuming this has been tested and works I'm OK with it as we already have other parts of the code that has been assisted as well/.

index.txt
I have attached the one of the api ref doc file of cinder which has been parsed , quality seems good to me for other project as well . I took help of cursor to generate the script:) . just an brief of script

  • check for api directories (api-ref/source and api-guide/source)
  • configures tox
  • builds html with tox
  • coverts html to plain text using pandoc
  • deletes the junk files

@lpiwowar
Copy link
Copy Markdown
Contributor

lpiwowar commented Feb 9, 2026

Code review

Found 1 issue:

  1. converted_count is initialized to 0 but never incremented inside the while loop, so the log message at line 254 will always report "Converted 0 HTML files to text" regardless of how many files were actually converted. A ((converted_count++)) or equivalent is missing from the loop body.

converted_count=0
while IFS= read -r -d '' html_file; do
rel_path="${html_file#./"$api_dir"/build/html/}"
text_file="./$api_dir/build/text/${rel_path%.html}.txt"
mkdir -p "$(dirname "$text_file")"
# Convert HTML to plain text using pandoc (consistent output)
pandoc -f html -t plain --wrap=preserve "$html_file" -o "$text_file" || {
echo "ERROR: Failed to convert $html_file"
return 1
}
done < <(find "./$api_dir/build/html" -name "*.html" -type f -print0)
echo "Converted $converted_count HTML files to text for $project"

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

@omkarjoshi0304
Copy link
Copy Markdown
Contributor Author

Code review

Found 1 issue:

  1. converted_count is initialized to 0 but never incremented inside the while loop, so the log message at line 254 will always report "Converted 0 HTML files to text" regardless of how many files were actually converted. A ((converted_count++)) or equivalent is missing from the loop body.

converted_count=0
while IFS= read -r -d '' html_file; do
rel_path="${html_file#./"$api_dir"/build/html/}"
text_file="./$api_dir/build/text/${rel_path%.html}.txt"
mkdir -p "$(dirname "$text_file")"
# Convert HTML to plain text using pandoc (consistent output)
pandoc -f html -t plain --wrap=preserve "$html_file" -o "$text_file" || {
echo "ERROR: Failed to convert $html_file"
return 1
}
done < <(find "./$api_dir/build/html" -name "*.html" -type f -print0)
echo "Converted $converted_count HTML files to text for $project"

🤖 Generated with Claude Code

  • If this code review was useful, please react with 👍. Otherwise, react with 👎.

Thanks for address counter incremented

Copy link
Copy Markdown
Contributor

@lpiwowar lpiwowar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apologies, these are just small things, but I think it should be fixed.

Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
Comment thread scripts/get_openstack_plaintext_docs.sh
@omkarjoshi0304
Copy link
Copy Markdown
Contributor Author

Apologies, these are just small things, but I think it should be fixed.

No worries I will fix it:)

@omkarjoshi0304 omkarjoshi0304 force-pushed the OSPRH-19255-api-ref branch 5 times, most recently from e890d85 to 347b7d0 Compare February 11, 2026 12:55
Comment thread scripts/generate_embeddings_openstack.py
Comment thread scripts/get_openstack_plaintext_docs.sh
Comment thread scripts/get_openstack_plaintext_docs.sh Outdated
@omkarjoshi0304 omkarjoshi0304 force-pushed the OSPRH-19255-api-ref branch 2 times, most recently from 69254f1 to 347b7d0 Compare February 16, 2026 13:11
@omkarjoshi0304 omkarjoshi0304 force-pushed the OSPRH-19255-api-ref branch 3 times, most recently from d4b1b21 to 16e2f3f Compare February 17, 2026 13:04
- Standardize on Pandoc for consistent RAG output; remove html2text fallback.
- Add strict error handling for conversion failures and missing tools.
- Fix "Url not reachable" errors by recursively pruning empty navigation index files.
- Auto-detect api-ref and api-guide sources to avoid missing project docs.

PR Comment fix
Copy link
Copy Markdown
Contributor

@lpiwowar lpiwowar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me! But I'm not giving an approval since I haven't tested it yet. I want to build the image myself and see what is on the inside. Until then, I do not feel comfortable giving approve 🙈 . I'll try to get to this soon!:) If somebody wants to do an approval anyway I'm ok with it.

Thanks, @omkarjoshi0304, for all the changes so far! The commit history looks nicer:) 💯

Thoughts:

  • It would be helpful if this PR was accompanied by some sort of proof of testing comment showcasing how did some API-REF chunks changed (e.g.: this is how I build the image, this is how the chunks looked before and this is how they look now).

  • Since we are later moving to OKP not sure how needed this is. But I think it would be nice if our pipeline sampled some of the chunks and showed them to stdout. Not needed to do this in this PR. It is just a thought:).

  • I think it would be good to later move the api-ref code to a separate function. The generate_text_doc() is getting quite busy.

@omkarjoshi0304
Copy link
Copy Markdown
Contributor Author

omkarjoshi0304 commented Feb 18, 2026

index.txt

Looks good to me! But I'm not giving an approval since I haven't tested it yet. I want to build the image myself and see what is on the inside. Until then, I do not feel comfortable giving approve 🙈 . I'll try to get to this soon!:) If somebody wants to do an approval anyway I'm ok with it.

Thanks, @omkarjoshi0304, for all the changes so far! The commit history looks nicer:) 💯

Thoughts:

  • It would be helpful if this PR was accompanied by some sort of proof of testing comment showcasing how did some API-REF chunks changed (e.g.: this is how I build the image, this is how the chunks looked before and this is how they look now).
  • Since we are later moving to OKP not sure how needed this is. But I think it would be nice if our pipeline sampled some of the chunks and showed them to stdout. Not needed to do this in this PR. It is just a thought:).
  • I think it would be good to later move the api-ref code to a separate function. The generate_text_doc() is getting quite busy.

Thanks for your comments:)

  • I have build a image which only contains api ref doc ( podman pull quay.io/rh-ee-ojoshi/api-ref ) also attached one sample file of the nova api ref doc .
  • Since we are later moving to OKP I am also not sure how much is this needed , but the main purpose of this pr is to clean the mess which I had created in this PR ( 69b5fa8 )
  • agreed to move it to separate function but that can be a separate PR:)

@omkarjoshi0304
Copy link
Copy Markdown
Contributor Author

Proof of testing

Image Build proof of html2text

[Image link](podman pull quay.io/rh-ee-ojoshi/api-ref-html)

There were few projects which were creating junk files and wrong chunking with this approach

ojoshi@ojoshi-mac rag-content % podman run --rm -it local-api-proof:latest /bin/bash
(app-root) ls
openstack-docs-plaintext  scripts
(app-root) cd openstack-docs-plaintext
(app-root) ls
heat  zun
(app-root) cd zun
(app-root) ls
2025.2_api-ref  2025.2_docs
(app-root) cd 2025.2_api-ref/_sources
(app-root) ls
index.rst.txt
(app-root) cat index.rst.txt
:tocdepth: 2

=======================
 Containers Service API
=======================

.. rest_expand_all::

.. include:: urls.inc
.. include:: capsules.inc
.. include:: containers.inc
.. include:: images.inc
.. include:: services.inc
.. include:: hosts.inc
.. include:: quotas.inc
.. include:: quota_classes.inc
(app-root) 
/tmp/os_docs_temp/zun/.tox/text-docs/lib/python3.11/site-packages/eventlet/__init__.py:83: DeprecationWarning: Using fork() is a bad idea, and there is no guarantee eventlet will work. See https://eventlet.readthedocs.io/en/latest/fork.html for more details.
  warnings.warn(
reading sources... [ 20%] admin/README .. cli/zun-status
reading sources... [ 40%] configuration/README .. contributor/gerrit
reading sources... [ 60%] contributor/index .. contributor/unit-tests
reading sources... [ 80%] contributor/vision-reflection .. install/overview
reading sources... [100%] install/verify .. user/filter-scheduler

looking for now-outdated files... none found
pickling environment... done
checking consistency... /tmp/os_docs_temp/zun/doc/source/contributor/quickstart.rst: document is referenced in multiple toctrees: ['contributor/index', 'index'], selecting: index <- contributor/quickstart
done
preparing documents... done
copying assets... 
copying assets: done
writing output... [ 25%] admin/clear-containers .. configuration/index
writing output... [ 50%] configuration/policy .. contributor/launchpad
writing output... [ 75%] contributor/mod-wsgi .. install/compute-install
writing output... [100%] install/controller-install .. user/filter-scheduler

build succeeded.

The text files are in doc/build/text.
  text-docs: OK (39.01=setup[38.30]+cmd[0.71] seconds)
  congratulations :) (39.06 seconds)
+ '[' '' == venv ']'
+ '[' true = true ']'
+ '[' -d ./api-ref/source ']'
+ grep -q text-api-ref tox.ini
+ echo '
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ local api_ref_failed=false
+ echo 'Building API-Ref documentation for zun...'
Building API-Ref documentation for zun...
+ tox -etext-api-ref
text-api-ref: install_deps> pip install os-api-ref -r /tmp/os_docs_temp/zun/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: get_requires_for_build_sdist> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
text-api-ref: install_package_deps> pip install 'Flask>=0.12.3' 'PyYAML>=5.1' 'SQLAlchemy>=1.2.0' 'WebOb>=1.8.1' 'alembic>=0.9.8' 'cotyledon>=1.5.0' 'docker>=4.3.0' 'eventlet>=0.28.0' 'futurist>=1.6.0' 'grpcio>=1.25.0' 'keystoneauth1>=3.14.0' 'keystonemiddleware>=9.0.0' 'kuryr-lib>=0.5.0' 'neutron-lib>=1.13.0' 'os-brick>=3.1.0' 'os-resource-classes>=0.1.0' 'os-traits>=0.15.0' 'os-vif>=1.15.1' 'oslo.concurrency>=4.1.0' 'oslo.config>=8.1.0' 'oslo.context>=3.1.0' 'oslo.db>=8.2.0' 'oslo.i18n>=5.0.0' 'oslo.log>=4.2.0' 'oslo.messaging>=14.1.0' 'oslo.middleware>=4.1.0' 'oslo.policy>=4.5.0' 'oslo.privsep>=2.2.0' 'oslo.rootwrap>=5.8.0' 'oslo.serialization>=3.2.0' 'oslo.service>=2.2.0' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=4.5.0' 'oslo.versionedobjects>=2.1.0' 'pbr>=5.5.0' 'pecan>=1.3.3' 'protobuf>=3.6.0' 'psutil>=3.2.2' 'pyroute2>=0.5.7' 'python-cinderclient>=7.1.0' 'python-glanceclient>=3.2.0' 'python-neutronclient>=7.2.0' 'requests>=2.20.1' 'retrying>=1.3.3' 'stevedore>=3.3.0' 'tenacity>=6.0.0' 'websocket-client>=0.44.0' 'websockify>=0.8.0'
text-api-ref: install_package> pip install --force-reinstall --no-deps /tmp/os_docs_temp/zun/.tox/.tmp/package/2/zun-0.0.0-0.editable-py3-none-any.whl
text-api-ref: commands[0]> sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
making output directory... done
Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`.
[openstackdocstheme] using theme from /tmp/os_docs_temp/zun/.tox/text-api-ref/lib/python3.11/site-packages/openstackdocstheme/theme
building [mo]: targets for 0 po files that are out of date
writing output... 
building [html]: targets for 1 source files that are out of date
updating environment: [new config] 1 added, 0 changed, 0 removed
reading sources... [100%] index

looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
copying assets... 
copying static files... 
Writing evaluated template result to /tmp/os_docs_temp/zun/api-ref/build/html/_static/basic.css
Writing evaluated template result to /tmp/os_docs_temp/zun/api-ref/build/html/_static/documentation_options.js
Writing evaluated template result to /tmp/os_docs_temp/zun/api-ref/build/html/_static/language_data.js
copying static files: done
copying extra files... 
copying extra files: done
copying assets: done

generating indices... genindex done
writing additional pages... search done
dumping search index in English (code: en)... done
dumping object inventory... done
Copying assets: api-site.css, api-site.js
Copying fonts: glyphicons-halflings-regular.ttf, glyphicons-halflings-regular.woff
build succeeded.

The HTML pages are in api-ref/build/html.
  text-api-ref: OK (39.79=setup[38.93]+cmd[0.86] seconds)
  congratulations :) (39.84 seconds)
+ '[' false '!=' true ']'
+ echo 'Converting API-Ref HTML to plain text...'
Converting API-Ref HTML to plain text...
+ rm -rf ./api-ref/build/text
+ mv ./api-ref/build/html ./api-ref/build/text
+ read -r html_file
++ find ./api-ref/build/text -name '*.html' -type f
+ text_file=./api-ref/build/text/index.txt
+ '[' -e ./api-ref/build/text/index.html ']'
+ python3.11 -m html2text ./api-ref/build/text/index.html
+ read -r html_file
+ text_file=./api-ref/build/text/genindex.txt
+ '[' -e ./api-ref/build/text/genindex.html ']'
+ python3.11 -m html2text ./api-ref/build/text/genindex.html
+ read -r html_file
+ text_file=./api-ref/build/text/search.txt
+ '[' -e ./api-ref/build/text/search.html ']'
+ python3.11 -m html2text ./api-ref/build/text/search.html
+ read -r html_file
+ find ./api-ref/build/text -type f '!' -name '*.txt' -delete
+ find ./api-ref/build/text -mindepth 1 -depth -type d -empty -delete
++ find ./api-ref/build/text -name '*.txt' '!' -name index.txt '!' -name genindex.txt '!' -name search.txt '!' -name api_microversion_history.txt -type f
++ wc -l
+ api_file_count=1
+ '[' 1 -gt 0 ']'
+ find ./api-ref/build/text -name api_microversion_history.txt -delete
+ find ./api-ref/build/text -mindepth 1 -depth -type d -empty -delete
+ '[' zun == adjutant ']'
+ '[' zun == cyborg ']'
+ '[' zun == tempest ']'
+ '[' zun == venus ']'
+ _output_version=2025.2
+ local project_output_dir=/tmp/os_docs_temp/openstack-docs-plaintext/zun
+ rm -rf /tmp/os_docs_temp/openstack-docs-plaintext/zun
+ mkdir -p /tmp/os_docs_temp/openstack-docs-plaintext/zun
+ '[' -d doc/build/text ']'
+ cp -r doc/build/text /tmp/os_docs_temp/openstack-docs-plaintext/zun/2025.2_docs
+ '[' true = true ']'
+ '[' -d ./api-ref/source ']'
+ '[' false '!=' true ']'
+ '[' -d api-ref/build/text ']'
+ cp -r api-ref/build/text /tmp/os_docs_temp/openstack-docs-plaintext/zun/2025.2_api-ref
+ echo 'API-Ref documentation copied for zun'
API-Ref documentation copied for zun
+ cd -
/tmp/os_docs_temp
+ '[' '' == all ']'
+ rm -rf '/tmp/os_docs_temp/openstack-docs-plaintext/zun/2025.2*/_static/' /tmp/os_docs_temp/openstack-docs-plaintext/zun/2025.2_docs/.doctrees/
+ echo
+ for log_file in "${LOG_FILES[@]}"
+ echo '-- /tmp/heat_AF5AP.log ---------------------------------------'
+ cat /tmp/heat_AF5AP.log

-- /tmp/heat_AF5AP.log ---------------------------------------
+ local project=heat
+ local _os_version=2025.2
+ local 'tox_text_docs_target=

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
'
+ local 'tox_text_api_ref_target=
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ echo 'Generating the plain-text documentation for OpenStack heat'
Generating the plain-text documentation for OpenStack heat
+ echo 'OS_API_DOCS is set to: true'
OS_API_DOCS is set to: true
+ local branch_prefix=
+ '[' 2025.2 '!=' master ']'
+ branch_prefix=stable/
+ '[' '!' -d heat ']'
+ git clone -v --depth=1 --single-branch -b stable/2025.2 https://opendev.org/openstack/heat.git
Cloning into 'heat'...
POST git-upload-pack (406 bytes)
POST git-upload-pack (194 bytes)
+ cd heat
+ '[' heat == designate ']'
+ '[' heat == ironic ']'
+ '[' heat == heat ']'
+ rm -rf doc/source/template_guide/
+ grep -q text-docs tox.ini
+ echo 'The text-docs target does not exist for heat. Appending it...'
The text-docs target does not exist for heat. Appending it...
+ echo '

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
'
+ '[' heat '!=' neutron-lib ']'
+ tox -etext-docs
text-docs: install_deps> python -I -m pip install -r /tmp/os_docs_temp/heat/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: install_requires> python -I -m pip install 'pbr>=6.0.0' 'setuptools>=64.0.0'
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_sdist> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: install_requires_for_build_sdist> python -I -m pip install 'pbr>=2.0.0'
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: install_requires_for_build_editable> python -I -m pip install 'pbr>=2.0.0'
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
text-docs: install_package_deps> python -I -m pip install 'PasteDeploy>=1.5.0' 'PyYAML>=5.1' 'Routes>=2.3.1' 'SQLAlchemy>=1.4.0' 'WebOb>=1.7.1' 'alembic>=1.8.0' 'aodhclient>=0.9.0' 'croniter>=0.3.4' 'cryptography>=2.5' 'keystoneauth1>=3.18.0' 'keystonemiddleware>=5.1.0' 'lxml>=4.5.0' 'netaddr>=0.7.18' 'neutron-lib>=1.14.0' 'openstacksdk>=0.28.0' 'oslo.cache>=1.26.0' 'oslo.concurrency>=3.26.0' 'oslo.config>=6.8.0' 'oslo.context>=2.22.0' 'oslo.db>=6.0.0' 'oslo.i18n>=3.20.0' 'oslo.log>=4.3.0' 'oslo.messaging>=14.1.0' 'oslo.middleware>=3.31.0' 'oslo.policy>=4.5.0' 'oslo.reports>=1.18.0' 'oslo.serialization>=2.25.0' 'oslo.service[threading]>=4.2.2' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=4.5.0' 'oslo.versionedobjects>=1.31.2' 'osprofiler>=1.4.0' 'pbr>=3.1.1' 'python-barbicanclient>=4.5.2' 'python-blazarclient>=1.0.1' 'python-cinderclient>=3.3.0' 'python-designateclient>=2.7.0' 'python-glanceclient>=2.8.0' 'python-heatclient>=1.10.0' 'python-ironicclient>=2.8.0' 'python-keystoneclient>=3.8.0' 'python-magnumclient>=2.3.0' 'python-manilaclient>=1.16.0' 'python-mistralclient>=3.1.0' 'python-neutronclient>=7.7.0' 'python-novaclient>=9.1.0' 'python-octaviaclient>=1.8.0' 'python-openstackclient>=3.12.0' 'python-swiftclient>=3.2.0' 'python-troveclient>=2.2.0' 'python-vitrageclient>=2.7.0' 'python-zaqarclient>=1.3.0' 'python-zunclient>=3.4.0' 'requests>=2.23.0' 'stevedore>=3.1.0' 'tenacity>=6.1.0' 'tzdata>=2022.4' 'yaql>=1.1.3'
text-docs: install_package> python -I -m pip install --force-reinstall --no-deps /tmp/os_docs_temp/heat/.tox/.tmp/package/1/openstack_heat-0.0.0-0.editable-py3-none-any.whl
text-docs: commands[0]> sphinx-build --keep-going -j auto -b text doc/source doc/build/text
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
Config option cache.memcache_username  is deprecated. Use option cache.username instead.
Config option cache.memcache_password  is deprecated. Use option cache.password instead.
loading stevedore.sphinxext
making output directory... done
[openstackdocstheme] overriding configured project name (Project name not set) with name extracted from the package (openstack-heat); you can disable this behavior with the 'openstackdocs_auto_name' option
Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`.
loading intersphinx inventory 'types_typedecorator' from https://docs.sqlalchemy.org/objects.inv ...
intersphinx inventory has moved: https://docs.sqlalchemy.org/objects.inv -> https://docs.sqlalchemy.org/en/20/objects.inv
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.versions.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.aws.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.aws.ec2token.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.aws.exception.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.aws.utils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.cfn.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.cfn.versions.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.cfn.wsgi.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.cfn.v1.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.cfn.v1.signal.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.cfn.v1.stacks.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.middleware.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.middleware.fault.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.middleware.version_negotiation.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.versions.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.wsgi.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.actions.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.build_info.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.events.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.resources.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.services.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.software_configs.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.software_deployments.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.stacks.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.util.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.views.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.views.stacks_view.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.api.openstack.v1.views.views_common.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.auth_password.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.auth_plugin.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.auth_url.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.cache.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.config.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.context.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.crypt.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.custom_backend_auth.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.endpoint_utils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.environment_format.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.environment_util.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.exception.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.grouputils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.i18n.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.identifier.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.lifecycle_plugin_utils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.messaging.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.netutils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.noauth.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.param_utils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.password_gen.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.plugin_loader.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.pluginutils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.policy.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.profiler.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.serializers.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.service_utils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.short_id.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.template_format.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.timeutils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.urlfetch.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.common.wsgi.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.db.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.db.api.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.db.filters.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.db.migration.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.db.models.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.db.types.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.db.utils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.api.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.attributes.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.check_resource.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.conditions.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.constraints.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.dependencies.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.environment.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.event.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.function.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.lifecycle_plugin.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.node_data.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.output.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.parameter_groups.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.parameters.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.parent_rsrc.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.plugin_manager.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.properties.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.properties_group.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resource.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.rsrc_defn.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.scheduler.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.service.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.service_software_config.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.software_config_io.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.stack.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.stack_lock.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.status.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.stk_defn.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.support.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.sync_point.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.template.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.template_common.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.template_files.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.timestamp.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.translation.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.update.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.worker.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.cfn.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.cfn.functions.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.cfn.parameters.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.cfn.template.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.client_exception.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.client_plugin.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.default_client_plugin.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.microversion_mixin.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.progress.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.aodh.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.barbican.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.blazar.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.cinder.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.designate.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.glance.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.heat_plugin.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.ironic.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.magnum.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.manila.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.mistral.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.nova.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.octavia.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.openstacksdk.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.swift.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.trove.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.vitrage.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.zaqar.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.zun.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.keystone.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.keystone.fake_keystoneclient.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.keystone.heat_keystoneclient.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.keystone.keystone_constraints.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.neutron.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.neutron.lbaas_constraints.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.neutron.neutron_constraints.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.clients.os.neutron.taas_constraints.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.constraint.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.constraint.common_constraints.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.hot.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.hot.functions.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.hot.parameters.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.hot.template.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.notification.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.notification.autoscaling.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.notification.stack.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.alarm_base.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.scheduler_hints.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.server_base.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.signal_responder.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.stack_resource.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.stack_user.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.template_resource.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.volume_base.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.engine.resources.wait_condition.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.base.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.event.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.fields.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.raw_template.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.raw_template_files.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.resource.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.resource_data.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.resource_properties_data.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.service.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.snapshot.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.software_config.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.software_deployment.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.stack.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.stack_lock.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.stack_tag.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.sync_point.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.objects.user_creds.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.actions.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.base.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.build_info.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.cloudformation.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.events.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.resource.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.resource_types.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.service.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.software_configs.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.software_deployments.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.policies.stacks.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.rpc.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.rpc.api.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.rpc.client.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.rpc.listener_client.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.rpc.worker_api.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.rpc.worker_client.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.scaling.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.scaling.cooldown.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.scaling.lbutils.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.scaling.rolling_update.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.scaling.scalingutil.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/heat.scaling.template.rst.
Creating file /tmp/os_docs_temp/heat/doc/source/api/modules.rst.
[openstackdocstheme] using theme from /tmp/os_docs_temp/heat/.tox/text-docs/lib/python3.11/site-packages/openstackdocstheme/theme
[oslo_config.sphinxconfiggen] reading config generator instructions from /tmp/os_docs_temp/heat/doc/source/../../etc/heat/heat-config-generator.conf
[oslo_config.sphinxconfiggen] writing sample configuration to /tmp/os_docs_temp/heat/doc/source/_static/heat.conf.sample
[oslo_policy.sphinxpolicygen] reading config generator instructions from /tmp/os_docs_temp/heat/doc/source/../../etc/heat/heat-policy-generator.conf
[oslo_policy.sphinxpolicygen] writing sample policy to /tmp/os_docs_temp/heat/doc/source/_static/heat.policy.yaml.sample
building [mo]: targets for 0 po files that are out of date
writing output... 
building [text]: targets for 52 source files that are out of date
updating environment: [new config] 262 added, 0 changed, 0 removed
reading sources... [  0%] admin/auth-model
reading sources... [  1%] admin/index
reading sources... [  1%] admin/introduction
reading sources... [  2%] admin/stack-domain-users
reading sources... [  2%] api/heat
reading sources... [  2%] api/heat.api
reading sources... [  3%] api/heat.api.aws
reading sources... [  3%] api/heat.api.aws.ec2token
reading sources... [  3%] api/heat.api.aws.exception
reading sources... [  4%] api/heat.api.aws.utils
reading sources... [  4%] api/heat.api.cfn
reading sources... [  5%] api/heat.api.cfn.v1
reading sources... [  5%] api/heat.api.cfn.v1.signal
reading sources... [  5%] api/heat.api.cfn.v1.stacks
reading sources... [  6%] api/heat.api.cfn.versions
reading sources... [  6%] api/heat.api.cfn.wsgi
reading sources... [  6%] api/heat.api.middleware
reading sources... [  7%] api/heat.api.middleware.fault
reading sources... [  7%] api/heat.api.middleware.version_negotiation
reading sources... [  8%] api/heat.api.openstack
reading sources... [  8%] api/heat.api.openstack.v1
reading sources... [  8%] api/heat.api.openstack.v1.actions
reading sources... [  9%] api/heat.api.openstack.v1.build_info
reading sources... [  9%] api/heat.api.openstack.v1.events
reading sources... [ 10%] api/heat.api.openstack.v1.resources
reading sources... [ 10%] api/heat.api.openstack.v1.services
reading sources... [ 10%] api/heat.api.openstack.v1.software_configs
reading sources... [ 11%] api/heat.api.openstack.v1.software_deployments
reading sources... [ 11%] api/heat.api.openstack.v1.stacks
reading sources... [ 11%] api/heat.api.openstack.v1.util
reading sources... [ 12%] api/heat.api.openstack.v1.views
reading sources... [ 12%] api/heat.api.openstack.v1.views.stacks_view
reading sources... [ 13%] api/heat.api.openstack.v1.views.views_common
reading sources... [ 13%] api/heat.api.openstack.versions
reading sources... [ 13%] api/heat.api.openstack.wsgi
reading sources... [ 14%] api/heat.api.versions
reading sources... [ 14%] api/heat.common
reading sources... [ 15%] api/heat.common.auth_password
reading sources... [ 15%] api/heat.common.auth_plugin
reading sources... [ 15%] api/heat.common.auth_url
reading sources... [ 16%] api/heat.common.cache
reading sources... [ 16%] api/heat.common.config
reading sources... [ 16%] api/heat.common.context
reading sources... [ 17%] api/heat.common.crypt
reading sources... [ 17%] api/heat.common.custom_backend_auth
reading sources... [ 18%] api/heat.common.endpoint_utils
reading sources... [ 18%] api/heat.common.environment_format
reading sources... [ 18%] api/heat.common.environment_util
reading sources... [ 19%] api/heat.common.exception
reading sources... [ 19%] api/heat.common.grouputils
reading sources... [ 19%] api/heat.common.i18n
reading sources... [ 20%] api/heat.common.identifier
reading sources... [ 20%] api/heat.common.lifecycle_plugin_utils
reading sources... [ 21%] api/heat.common.messaging
reading sources... [ 21%] api/heat.common.netutils
reading sources... [ 21%] api/heat.common.noauth
reading sources... [ 22%] api/heat.common.param_utils
reading sources... [ 22%] api/heat.common.password_gen
reading sources... [ 23%] api/heat.common.plugin_loader
reading sources... [ 23%] api/heat.common.pluginutils
reading sources... [ 23%] api/heat.common.policy
reading sources... [ 24%] api/heat.common.profiler
reading sources... [ 24%] api/heat.common.serializers
reading sources... [ 24%] api/heat.common.service_utils
reading sources... [ 25%] api/heat.common.short_id
reading sources... [ 25%] api/heat.common.template_format
reading sources... [ 26%] api/heat.common.timeutils
reading sources... [ 26%] api/heat.common.urlfetch
reading sources... [ 26%] api/heat.common.wsgi
reading sources... [ 27%] api/heat.db
reading sources... [ 27%] api/heat.db.api
reading sources... [ 27%] api/heat.db.filters
reading sources... [ 28%] api/heat.db.migration
reading sources... [ 28%] api/heat.db.models
reading sources... [ 29%] api/heat.db.types
reading sources... [ 29%] api/heat.db.utils
reading sources... [ 29%] api/heat.engine
reading sources... [ 30%] api/heat.engine.api
reading sources... [ 30%] api/heat.engine.attributes
reading sources... [ 31%] api/heat.engine.cfn
reading sources... [ 31%] api/heat.engine.cfn.functions
reading sources... [ 31%] api/heat.engine.cfn.parameters
reading sources... [ 32%] api/heat.engine.cfn.template
reading sources... [ 32%] api/heat.engine.check_resource
reading sources... [ 32%] api/heat.engine.clients
reading sources... [ 33%] api/heat.engine.clients.client_exception
reading sources... [ 33%] api/heat.engine.clients.client_plugin
reading sources... [ 34%] api/heat.engine.clients.default_client_plugin
reading sources... [ 34%] api/heat.engine.clients.microversion_mixin
reading sources... [ 34%] api/heat.engine.clients.os
reading sources... [ 35%] api/heat.engine.clients.os.aodh
reading sources... [ 35%] api/heat.engine.clients.os.barbican
reading sources... [ 35%] api/heat.engine.clients.os.blazar
reading sources... [ 36%] api/heat.engine.clients.os.cinder
reading sources... [ 36%] api/heat.engine.clients.os.designate
reading sources... [ 37%] api/heat.engine.clients.os.glance
reading sources... [ 37%] api/heat.engine.clients.os.heat_plugin
reading sources... [ 37%] api/heat.engine.clients.os.ironic
reading sources... [ 38%] api/heat.engine.clients.os.keystone
reading sources... [ 38%] api/heat.engine.clients.os.keystone.fake_keystoneclient
reading sources... [ 39%] api/heat.engine.clients.os.keystone.heat_keystoneclient
reading sources... [ 39%] api/heat.engine.clients.os.keystone.keystone_constraints
reading sources... [ 39%] api/heat.engine.clients.os.magnum
reading sources... [ 40%] api/heat.engine.clients.os.manila
reading sources... [ 40%] api/heat.engine.clients.os.mistral
reading sources... [ 40%] api/heat.engine.clients.os.neutron
reading sources... [ 41%] api/heat.engine.clients.os.neutron.lbaas_constraints
reading sources... [ 41%] api/heat.engine.clients.os.neutron.neutron_constraints
reading sources... [ 42%] api/heat.engine.clients.os.neutron.taas_constraints
reading sources... [ 42%] api/heat.engine.clients.os.nova
reading sources... [ 42%] api/heat.engine.clients.os.octavia
reading sources... [ 43%] api/heat.engine.clients.os.openstacksdk
reading sources... [ 43%] api/heat.engine.clients.os.swift
reading sources... [ 44%] api/heat.engine.clients.os.trove
reading sources... [ 44%] api/heat.engine.clients.os.vitrage
reading sources... [ 44%] api/heat.engine.clients.os.zaqar
reading sources... [ 45%] api/heat.engine.clients.os.zun
reading sources... [ 45%] api/heat.engine.clients.progress
reading sources... [ 45%] api/heat.engine.conditions
reading sources... [ 46%] api/heat.engine.constraint
reading sources... [ 46%] api/heat.engine.constraint.common_constraints
reading sources... [ 47%] api/heat.engine.constraints
reading sources... [ 47%] api/heat.engine.dependencies
reading sources... [ 47%] api/heat.engine.environment
reading sources... [ 48%] api/heat.engine.event
reading sources... [ 48%] api/heat.engine.function
reading sources... [ 48%] api/heat.engine.hot
reading sources... [ 49%] api/heat.engine.hot.functions
reading sources... [ 49%] api/heat.engine.hot.parameters
reading sources... [ 50%] api/heat.engine.hot.template
reading sources... [ 50%] api/heat.engine.lifecycle_plugin
reading sources... [ 50%] api/heat.engine.node_data
reading sources... [ 51%] api/heat.engine.notification
reading sources... [ 51%] api/heat.engine.notification.autoscaling
reading sources... [ 52%] api/heat.engine.notification.stack
reading sources... [ 52%] api/heat.engine.output
reading sources... [ 52%] api/heat.engine.parameter_groups
reading sources... [ 53%] api/heat.engine.parameters
reading sources... [ 53%] api/heat.engine.parent_rsrc
reading sources... [ 53%] api/heat.engine.plugin_manager
reading sources... [ 54%] api/heat.engine.properties
reading sources... [ 54%] api/heat.engine.properties_group
reading sources... [ 55%] api/heat.engine.resource
reading sources... [ 55%] api/heat.engine.resources
reading sources... [ 55%] api/heat.engine.resources.alarm_base
reading sources... [ 56%] api/heat.engine.resources.scheduler_hints
reading sources... [ 56%] api/heat.engine.resources.server_base
reading sources... [ 56%] api/heat.engine.resources.signal_responder
reading sources... [ 57%] api/heat.engine.resources.stack_resource
reading sources... [ 57%] api/heat.engine.resources.stack_user
reading sources... [ 58%] api/heat.engine.resources.template_resource
reading sources... [ 58%] api/heat.engine.resources.volume_base
reading sources... [ 58%] api/heat.engine.resources.wait_condition
reading sources... [ 59%] api/heat.engine.rsrc_defn
reading sources... [ 59%] api/heat.engine.scheduler
reading sources... [ 60%] api/heat.engine.service
reading sources... [ 60%] api/heat.engine.service_software_config
reading sources... [ 60%] api/heat.engine.software_config_io
reading sources... [ 61%] api/heat.engine.stack
reading sources... [ 61%] api/heat.engine.stack_lock
reading sources... [ 61%] api/heat.engine.status
reading sources... [ 62%] api/heat.engine.stk_defn
reading sources... [ 62%] a+ echo
+ for log_file in "${LOG_FILES[@]}"
+ echo '-- /tmp/magnum'\''_imVbI.log ---------------------------------------'
+ cat '/tmp/magnum'\''_imVbI.log'
pi/heat.engine.support
reading sources... [ 63%] api/heat.engine.sync_point
reading sources... [ 63%] api/heat.engine.template
reading sources... [ 63%] api/heat.engine.template_common
reading sources... [ 64%] api/heat.engine.template_files
reading sources... [ 64%] api/heat.engine.timestamp
reading sources... [ 65%] api/heat.engine.translation
reading sources... [ 65%] api/heat.engine.update
reading sources... [ 65%] api/heat.engine.worker
reading sources... [ 66%] api/heat.objects
reading sources... [ 66%] api/heat.objects.base
reading sources... [ 66%] api/heat.objects.event
reading sources... [ 67%] api/heat.objects.fields
reading sources... [ 67%] api/heat.objects.raw_template
reading sources... [ 68%] api/heat.objects.raw_template_files
reading sources... [ 68%] api/heat.objects.resource
reading sources... [ 68%] api/heat.objects.resource_data
reading sources... [ 69%] api/heat.objects.resource_properties_data
reading sources... [ 69%] api/heat.objects.service
reading sources... [ 69%] api/heat.objects.snapshot
reading sources... [ 70%] api/heat.objects.software_config
reading sources... [ 70%] api/heat.objects.software_deployment
reading sources... [ 71%] api/heat.objects.stack
reading sources... [ 71%] api/heat.objects.stack_lock
reading sources... [ 71%] api/heat.objects.stack_tag
reading sources... [ 72%] api/heat.objects.sync_point
reading sources... [ 72%] api/heat.objects.user_creds
reading sources... [ 73%] api/heat.policies
reading sources... [ 73%] api/heat.policies.actions
reading sources... [ 73%] api/heat.policies.base
reading sources... [ 74%] api/heat.policies.build_info
reading sources... [ 74%] api/heat.policies.cloudformation
reading sources... [ 74%] api/heat.policies.events
reading sources... [ 75%] api/heat.policies.resource
reading sources... [ 75%] api/heat.policies.resource_types
reading sources... [ 76%] api/heat.policies.service
reading sources... [ 76%] api/heat.policies.software_configs
reading sources... [ 76%] api/heat.policies.software_deployments
reading sources... [ 77%] api/heat.policies.stacks
reading sources... [ 77%] api/heat.rpc
reading sources... [ 77%] api/heat.rpc.api
reading sources... [ 78%] api/heat.rpc.client
reading sources... [ 78%] api/heat.rpc.listener_client
reading sources... [ 79%] api/heat.rpc.worker_api
reading sources... [ 79%] api/heat.rpc.worker_client
reading sources... [ 79%] api/heat.scaling
reading sources... [ 80%] api/heat.scaling.cooldown
reading sources... [ 80%] api/heat.scaling.lbutils
reading sources... [ 81%] api/heat.scaling.rolling_update
reading sources... [ 81%] api/heat.scaling.scalingutil
reading sources... [ 81%] api/heat.scaling.template
reading sources... [ 82%] api/index
reading sources... [ 82%] api/modules
reading sources... [ 82%] configuration/config-options
loading config file etc/heat/heat-config-generator.conf
/tmp/os_docs_temp/heat/.tox/text-docs/lib/python3.11/site-packages/oslo_i18n/_message.py:213: UserWarning: Failed to insert replacement values into translated message Optional heat url in format like http://127.0.0.1:8004/v1/%(tenant_id)s. (Original: 'Optional heat url in format like http://127.0.0.1:8004/v1/%(tenant_id)s.'): 'tenant_id'
  warnings.warn(msg % (translated_message, self.msgid, err))
reading sources... [ 83%] configuration/index
reading sources... [ 83%] configuration/logs
reading sources... [ 84%] configuration/sample_config
reading sources... [ 84%] configuration/sample_policy
reading sources... [ 84%] contributor/contributing
reading sources... [ 85%] contributor/index
reading sources... [ 85%] developing_guides/architecture
reading sources... [ 85%] developing_guides/blueprints
reading sources... [ 86%] developing_guides/gmr
reading sources... [ 86%] developing_guides/index
reading sources... [ 87%] developing_guides/pluginguide
reading sources... [ 87%] developing_guides/rally_on_gates
reading sources... [ 87%] developing_guides/schedulerhints
reading sources... [ 88%] developing_guides/supportstatus
reading sources... [ 88%] getting_started/create_a_stack
reading sources... [ 89%] getting_started/index
reading sources... [ 89%] getting_started/on_devstack
reading sources... [ 89%] getting_started/on_fedora
reading sources... [ 90%] getting_started/on_other
reading sources... [ 90%] getting_started/on_ubuntu
reading sources... [ 90%] getting_started/standalone
reading sources... [ 91%] glossary
reading sources... [ 91%] index
reading sources... [ 92%] install/get_started
reading sources... [ 92%] install/index
reading sources... [ 92%] install/install
reading sources... [ 93%] install/install-debian
reading sources... [ 93%] install/install-rdo
reading sources... [ 94%] install/install-ubuntu
reading sources... [ 94%] install/launch-instance
reading sources... [ 94%] install/next-steps
reading sources... [ 95%] install/verify
reading sources... [ 95%] man/heat-api
reading sources... [ 95%] man/heat-api-cfn
reading sources... [ 96%] man/heat-db-setup
reading sources... [ 96%] man/heat-engine
reading sources... [ 97%] man/heat-keystone-setup-domain
reading sources... [ 97%] man/heat-manage
reading sources... [ 97%] man/heat-status
reading sources... [ 98%] man/index
reading sources... [ 98%] operating_guides/httpd
reading sources... [ 98%] operating_guides/scale_deployment
reading sources... [ 99%] operating_guides/upgrades_guide
reading sources... [ 99%] templates/cfn/WordPress_Single_Instance
reading sources... [100%] templates/hot/hello_world
reading sources... [100%] templates/index

WARNING: the ext.resources extension does not declare if it is safe for parallel reading, assuming it isn't - please ask the extension author to check and make it explicit
WARNING: doing serial read
/tmp/os_docs_temp/heat/doc/source/index.rst:73: WARNING: toctree contains reference to nonexisting document 'template_guide/index' [toc.not_readable]
looking for now-outdated files... none found
pickling environment... done
checking consistency... /tmp/os_docs_temp/heat/doc/source/getting_started/on_devstack.rst: document is referenced in multiple toctrees: ['developing_guides/index', 'getting_started/index'], selecting: getting_started/index <- getting_started/on_devstack
done
preparing documents... done
copying assets... 
copying assets: done
writing output... [ 11%] admin/index .. api/heat.api.openstack.v1.util
writing output... [ 22%] api/heat.api.openstack.v1.views .. api/heat.common.plugin_loader
writing output... [ 33%] api/heat.common.pluginutils .. api/heat.engine.clients.default_client_plugin
writing output... [ 44%] api/heat.engine.clients.microversion_mixin .. api/heat.engine.clients.os.zun
writing output... [ 56%] api/heat.engine.clients.progress .. api/heat.engine.resources.scheduler_hints
/tmp/os_docs_temp/heat/doc/source/getting_started/create_a_stack.rst:121: WARNING: undefined label: 'template-guide' [ref.ref]
writing output... [ 67%] api/heat.engine.resources.server_base .. api/heat.objects.fields
/tmp/os_docs_temp/heat/doc/source/glossary.rst:39: WARNING: undefined label: 'environments' [ref.ref]
/tmp/os_docs_temp/heat/doc/source/install/index.rst:14: WARNING: undefined label: 'hot_guide' [ref.ref]
/tmp/os_docs_temp/heat/doc/source/install/launch-instance.rst:12: WARNING: undefined label: 'template-guide' [ref.ref]
writing output... [ 78%] api/heat.objects.raw_template .. api/heat.rpc.client
writing output... [ 89%] api/heat.rpc.listener_client .. getting_started/on_devstack
writing output... [100%] getting_started/on_fedora .. templates/index

build succeeded, 7 warnings.

The text files are in doc/build/text.
.pkg: _exit> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
  text-docs: OK (46.07=setup[36.27]+cmd[9.80] seconds)
  congratulations :) (46.10 seconds)
+ '[' '' == venv ']'
+ '[' true = true ']'
+ '[' -d ./api-ref/source ']'
+ grep -q text-api-ref tox.ini
+ echo '
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ local api_ref_failed=false
+ echo 'Building API-Ref documentation for heat...'
Building API-Ref documentation for heat...
+ tox -etext-api-ref
text-api-ref: install_deps> python -I -m pip install os-api-ref -r /tmp/os_docs_temp/heat/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_sdist> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
text-api-ref: install_package_deps> python -I -m pip install 'PasteDeploy>=1.5.0' 'PyYAML>=5.1' 'Routes>=2.3.1' 'SQLAlchemy>=1.4.0' 'WebOb>=1.7.1' 'alembic>=1.8.0' 'aodhclient>=0.9.0' 'croniter>=0.3.4' 'cryptography>=2.5' 'keystoneauth1>=3.18.0' 'keystonemiddleware>=5.1.0' 'lxml>=4.5.0' 'netaddr>=0.7.18' 'neutron-lib>=1.14.0' 'openstacksdk>=0.28.0' 'oslo.cache>=1.26.0' 'oslo.concurrency>=3.26.0' 'oslo.config>=6.8.0' 'oslo.context>=2.22.0' 'oslo.db>=6.0.0' 'oslo.i18n>=3.20.0' 'oslo.log>=4.3.0' 'oslo.messaging>=14.1.0' 'oslo.middleware>=3.31.0' 'oslo.policy>=4.5.0' 'oslo.reports>=1.18.0' 'oslo.serialization>=2.25.0' 'oslo.service[threading]>=4.2.2' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=4.5.0' 'oslo.versionedobjects>=1.31.2' 'osprofiler>=1.4.0' 'pbr>=3.1.1' 'python-barbicanclient>=4.5.2' 'python-blazarclient>=1.0.1' 'python-cinderclient>=3.3.0' 'python-designateclient>=2.7.0' 'python-glanceclient>=2.8.0' 'python-heatclient>=1.10.0' 'python-ironicclient>=2.8.0' 'python-keystoneclient>=3.8.0' 'python-magnumclient>=2.3.0' 'python-manilaclient>=1.16.0' 'python-mistralclient>=3.1.0' 'python-neutronclient>=7.7.0' 'python-novaclient>=9.1.0' 'python-octaviaclient>=1.8.0' 'python-openstackclient>=3.12.0' 'python-swiftclient>=3.2.0' 'python-troveclient>=2.2.0' 'python-vitrageclient>=2.7.0' 'python-zaqarclient>=1.3.0' 'python-zunclient>=3.4.0' 'requests>=2.23.0' 'stevedore>=3.1.0' 'tenacity>=6.1.0' 'tzdata>=2022.4' 'yaql>=1.1.3'
text-api-ref: install_package> python -I -m pip install --force-reinstall --no-deps /tmp/os_docs_temp/heat/.tox/.tmp/package/2/openstack_heat-0.0.0-0.editable-py3-none-any.whl
text-api-ref: commands[0]> sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
making output directory... done
[openstackdocstheme] overriding configured project name (Project name not set) with name extracted from the package (openstack-heat); you can disable this behavior with the 'openstackdocs_auto_name' option
Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`.
[openstackdocstheme] using theme from /tmp/os_docs_temp/heat/.tox/text-api-ref/lib/python3.11/site-packages/openstackdocstheme/theme
building [mo]: targets for 0 po files that are out of date
writing output... 
building [html]: targets for 2 source files that are out of date
updating environment: [new config] 2 added, 0 changed, 0 removed
reading sources... [ 50%] index
reading sources... [100%] v1/index

looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
copying assets... 
copying static files... 
Writing evaluated template result to /tmp/os_docs_temp/heat/api-ref/build/html/_static/basic.css
Writing evaluated template result to /tmp/os_docs_temp/heat/api-ref/build/html/_static/documentation_options.js
Writing evaluated template result to /tmp/os_docs_temp/heat/api-ref/build/html/_static/language_data.js
copying static files: done
copying extra files... 
copying extra files: done
copying assets: done
[openstackdocstheme] could not determine last_updated for 'v1/index'
writing output... [100%] v1/index

generating indices... genindex done
writing additional pages... search done
dumping search index in English (code: en)... done
dumping object inventory... done
Copying assets: api-site.css, api-site.js
Copying fonts: glyphicons-halflings-regular.ttf, glyphicons-halflings-regular.woff
build succeeded.

The HTML pages are in api-ref/build/html.
.pkg: _exit> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
  text-api-ref: OK (35.05=setup[33.98]+cmd[1.07] seconds)
  congratulations :) (35.09 seconds)
+ '[' false '!=' true ']'
+ echo 'Converting API-Ref HTML to plain text...'
Converting API-Ref HTML to plain text...
+ rm -rf ./api-ref/build/text
+ mv ./api-ref/build/html ./api-ref/build/text
+ read -r html_file
++ find ./api-ref/build/text -name '*.html' -type f
+ text_file=./api-ref/build/text/index.txt
+ '[' -e ./api-ref/build/text/index.html ']'
+ python3.11 -m html2text ./api-ref/build/text/index.html
+ read -r html_file
+ text_file=./api-ref/build/text/v1/index.txt
+ '[' -e ./api-ref/build/text/v1/index.html ']'
+ python3.11 -m html2text ./api-ref/build/text/v1/index.html
+ read -r html_file
+ text_file=./api-ref/build/text/genindex.txt
+ '[' -e ./api-ref/build/text/genindex.html ']'
+ python3.11 -m html2text ./api-ref/build/text/genindex.html
+ read -r html_file
+ text_file=./api-ref/build/text/search.txt
+ '[' -e ./api-ref/build/text/search.html ']'
+ python3.11 -m html2text ./api-ref/build/text/search.html
+ read -r html_file
+ find ./api-ref/build/text -type f '!' -name '*.txt' -delete
+ find ./api-ref/build/text -mindepth 1 -depth -type d -empty -delete
++ find ./api-ref/build/text -name '*.txt' '!' -name index.txt '!' -name genindex.txt '!' -name search.txt '!' -name api_microversion_history.txt -type f
++ wc -l
+ api_file_count=2
+ '[' 2 -gt 0 ']'
+ find ./api-ref/build/text -name api_microversion_history.txt -delete
+ find ./api-ref/build/text -mindepth 1 -depth -type d -empty -delete
+ '[' heat == adjutant ']'
+ '[' heat == cyborg ']'
+ '[' heat == tempest ']'
+ '[' heat == venus ']'
+ _output_version=2025.2
+ local project_output_dir=/tmp/os_docs_temp/openstack-docs-plaintext/heat
+ rm -rf /tmp/os_docs_temp/openstack-docs-plaintext/heat
+ mkdir -p /tmp/os_docs_temp/openstack-docs-plaintext/heat
+ '[' -d doc/build/text ']'
+ cp -r doc/build/text /tmp/os_docs_temp/openstack-docs-plaintext/heat/2025.2_docs
+ '[' true = true ']'
+ '[' -d ./api-ref/source ']'
+ '[' false '!=' true ']'
+ '[' -d api-ref/build/text ']'
+ cp -r api-ref/build/text /tmp/os_docs_temp/openstack-docs-plaintext/heat/2025.2_api-ref
+ echo 'API-Ref documentation copied for heat'
API-Ref documentation copied for heat
+ cd -
/tmp/os_docs_temp
+ '[' '' == all ']'
+ rm -rf '/tmp/os_docs_temp/openstack-docs-plaintext/heat/2025.2*/_static/' /tmp/os_docs_temp/openstack-docs-plaintext/heat/2025.2_docs/.doctrees/

-- /tmp/magnum'_imVbI.log ---------------------------------------
+ local 'project=magnum'\'''
+ local _os_version=2025.2
+ local 'tox_text_docs_target=

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
'
+ local 'tox_text_api_ref_target=
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ echo 'Generating the plain-text documentation for OpenStack magnum'\'''
Generating the plain-text documentation for OpenStack magnum'
+ echo 'OS_API_DOCS is set to: true'
OS_API_DOCS is set to: true
+ local branch_prefix=
+ '[' 2025.2 '!=' master ']'
+ branch_prefix=stable/
+ '[' '!' -d 'magnum'\''' ']'
+ git clone -v --depth=1 --single-branch -b stable/2025.2 'https://opendev.org/openstack/magnum'\''.git'
Cloning into 'magnum''...
fatal: could not read Username for 'https://opendev.org': No such device or address
+ echo

+ pushd /tmp/os_docs_temp/openstack-docs-plaintext
/tmp/os_docs_temp/openstack-docs-plaintext /tmp/os_docs_temp
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- glance/2024.2_docs/contributor/api/glance.common.format_inspector.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- neutron/2024.2_docs/contributor/internals/linuxbridge_agent.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- neutron/2024.2_docs/contributor/testing/ci_scenario_jobs.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- python-openstackclient/2024.2_docs/contributor/api/openstackclient.volume.v1.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- python-openstackclient/2024.2_docs/contributor/specs/command-objects/example.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- python-openstackclient/2024.2_docs/contributor/specs/commands.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- python-openstackclient/2024.2_docs/contributor/specs/network-topology.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.limits.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.snapshots.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.views.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.volume_metadata.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.volumes.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.views.volumes.txt
/tmp/os_docs_temp
+ popd
+ rm -rf '/rag-content/openstack-docs-plaintext/*/2025.2'
+ cp -r /tmp/os_docs_temp/openstack-docs-plaintext /rag-content/openstack-docs-plaintext
+ echo 'Done. Documents can be found at /rag-content/openstack-docs-plaintext'
Done. Documents can be found at /rag-content/openstack-docs-plaintext
COMMIT local-api-proof:latest
--> c37247db4480
Successfully tagged localhost/local-api-proof:latest
c37247db448008da861e76e91669bd111ffca015528e829aa7d8eee16d60e2ab

@omkarjoshi0304
Copy link
Copy Markdown
Contributor Author

Image Build proof of Pandoc

[Image link](podman pull quay.io/rh-ee-ojoshi/api-ref-pandoc)

This approach has better chunking quality and no junk navigation files

ojoshi@ojoshi-mac rag-content % podman run --rm -it local-api-proof-pandoc:latest /bin/bash
(app-root) ls
openstack-docs-plaintext  scripts
(app-root) cd openstack-docs-plaintext
(app-root) ls
adjutant  heat	magnum	masakari  neutron-lib  nova  zaqar  zun
(app-root) cd zun
(app-root) ls
2025.2_api-ref	2025.2_docs
(app-root) cd 2025.2_api-ref
(app-root) ls
index.txt
(app-root) cat index.txt
[]

Toggle navigation

Search

-   

-   Software
    -   Overview
    -   OpenStack Components
    -   SDKs
    -   Deployment Tools
    -   OpenStack Map
    -   Sample Configs

-   Use Cases
    -   Users in Production

    -   

        ------------------------------------------------------------------------

    -   Ironic Bare Metal

    -   Edge Computing

    -   Telecom & NFV

    -   Science and HPC

    -   Containers

    -   Enterprise

    -   User Survey

-   Events
    -   OpenInfra Summit
    -   Project Teams Gathering
    -   OpenDev
    -   Community Events
    -   OpenStack & OpenInfra Days
    -   Summit Videos

-   Community
    -   Welcome! Start Here

    -   OpenStack Technical Committee

    -   Speakers Bureau

    -   OpenStack Wiki

    -   Get Certified (COA)

    -   Jobs

    -   Marketing Resources

    -   Community News

    -   Superuser Magazine

    -   

        ------------------------------------------------------------------------

    -   OpenInfra Foundation Supporting Organizations

    -   OpenInfra Foundation

-   Marketplace
    -   Training
    -   Distros & Appliances
    -   Public Clouds
    -   Hosted Private Clouds
    -   Remotely Managed Private Clouds
    -   Consulting & Integrators
    -   Drivers

-   Blog

-   Docs

-   Join
    -   Sign up for Foundation Membership
    -   Sponsor the Foundation
    -   More about the Foundation

-   Log In

Containers Service API

Containers Service API¶

Show All

Zun Base URLs¶

All API calls through the rest of this document require authentication
with the OpenStack Identity service. They also required a url that
is extracted from the Identity token of type
container. This will be the root url that every call below will be
added to build a full path.

Note that if using OpenStack Identity service API v2, url can be
represented via adminURL, internalURL or publicURL in endpoint
catalog. In Identity service API v3, url is represented with field
interface including admin, internal and public.

For instance, if the url is
http://my-zun-url.org/zun/v1 then the full API call for
/containers is http://my-zun-url.org/zun/v1/containers.

Depending on the deployment the containers service
url might be http or https, a custom port, a custom path, and include your
project id. The only way to know the urls for your deployment is by using the
service catalog. The containers service URL should never be
hard coded in applications, even if they are only expected to work at a
single site. It should always be discovered from the Identity token.

As such, for the rest of this document we will be using short hand
where GET /containers really means
GET {your_zun_url}/containers.

Manage Capsules (Pods)¶

Lists, creates, shows details for, and deletes capsules.

Capsules is a collection of containers that can run on a host.
It is basically a Zun implementation of Kubernetes Pod.
Containers inside a capsule share the Neutron network and Cinder volumes.

POST

/v1/capsules/

Create new capsule

detail

Create new capsule.

Response Codes¶

Success¶

  Code             Reason
  ---------------- ---------------------------------------------------------------------------
  202 - Accepted   Request was accepted for processing, but the processing has not been
                   completed. A ‘location’ header is included in the response which contains
                   a link to check the progress of the request.

Error¶

  Code                 Reason
  -------------------- ----------------------------------------------------------
  400 - Bad Request    Some content in the request was invalid.
  401 - Unauthorized   User must authenticate before making a request.
  403 - Forbidden      Policy does not allow current user to do this operation.

Request¶

Capsule Template¶

+-----------------+-----------------+-----------------+-----------------+
| Name            | In              | Type            | Description     |
+=================+=================+=================+=================+
| template        | body            | object          | A template for  |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| kind            | body            | string          | A string value  |
|                 |                 |                 | representing    |
|                 |                 |                 | the type of     |
|                 |                 |                 | this object.    |
|                 |                 |                 | Its value is    |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| metadata        | body            | object          | Capsule         |
| (Optional)      |                 |                 | metadata in     |
|                 |                 |                 | key-value       |
|                 |                 |                 | format.         |
|                 |                 |                 | Keys can be     |
|                 |                 |                 | name, labels    |
|                 |                 |                 | and             |
|                 |                 |                 | annotations.    |
|                 |                 |                 | An example      |
|                 |                 |                 | format would    |
|                 |                 |                 | look as         |
|                 |                 |                 | follows:        |
|                 |                 |                 |                 |
|                 |                 |                 |                 |
|                 |                 |                 |   "metadata": { |
|                 |                 |                 |                 |
|                 |                 |                 |      "labels":  |
|                 |                 |                 | {"app": "web"}, |
|                 |                 |                 |                 |
|                 |                 |                 | "name": "demo", |
|                 |                 |                 |           "an   |
|                 |                 |                 | notations": {"k |
|                 |                 |                 | ey1": "value1"} |
|                 |                 |                 |       }         |
+-----------------+-----------------+-----------------+-----------------+
| metadata.labels | body            | object          | The labels      |
| (Optional)      |                 |                 | added to the    |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| metadata.name   | body            | string          | The name of the |
| (Optional)      |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| metad           | body            | object          | The annotations |
| ata.annotations |                 |                 | added to the    |
| (Optional)      |                 |                 | capsule.        |
|                 |                 |                 | Annotations is  |
|                 |                 |                 | an unstructured |
|                 |                 |                 | key value map   |
|                 |                 |                 | stored with a   |
|                 |                 |                 | resource        |
|                 |                 |                 | that may be set |
|                 |                 |                 | by external     |
|                 |                 |                 | tools to store  |
|                 |                 |                 | and retrieve    |
|                 |                 |                 | arbitrary       |
|                 |                 |                 | metadata.       |
+-----------------+-----------------+-----------------+-----------------+
| spec            | body            | object          | Specification   |
|                 |                 |                 | of the desired  |
|                 |                 |                 | behavior of the |
|                 |                 |                 | capsule.        |
|                 |                 |                 | See Capsule     |
|                 |                 |                 | Spec.           |
+-----------------+-----------------+-----------------+-----------------+

Capsule Spec¶

  Name                        In     Type     Description
  --------------------------- ------ -------- -------------------------------------------------------
  containers                  body   array    A list of containers objects.
  initContainers (Optional)   body   array    A list of init containers objects.
  restartPolicy (Optional)    body   string   Restart policy for all containers within the capsule.
                                              Its value can be Always, OnFailure, or Never.
  volumes (Optional)          body   array    List of volumes that can be mounted by
                                              containers in this capsule.

Capsule Container¶

+-----------------+-----------------+-----------------+-----------------+
| Name            | In              | Type            | Description     |
+=================+=================+=================+=================+
| image           | body            | string          | The name or ID  |
|                 |                 |                 | of the image.   |
+-----------------+-----------------+-----------------+-----------------+
| command         | body            | array           | The command of  |
| (Optional)      |                 |                 | the container.  |
+-----------------+-----------------+-----------------+-----------------+
| args (Optional) | body            | array           | The arguments   |
|                 |                 |                 | to the command. |
+-----------------+-----------------+-----------------+-----------------+
| env (Optional)  | body            | object          | The environment |
|                 |                 |                 | variables to    |
|                 |                 |                 | set in the      |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| name (Optional) | body            | string          | The name of the |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| ports           | body            | array           | List of ports   |
| (Optional)      |                 |                 | to expose from  |
|                 |                 |                 | the container.  |
|                 |                 |                 | Each item is a  |
|                 |                 |                 | dictionary must |
|                 |                 |                 | contain a       |
|                 |                 |                 | containerPort   |
|                 |                 |                 | key.            |
|                 |                 |                 | Optionally, it  |
|                 |                 |                 | can contain a   |
|                 |                 |                 | protocol key.   |
|                 |                 |                 | An example      |
|                 |                 |                 | format would    |
|                 |                 |                 | look as         |
|                 |                 |                 | follows:        |
|                 |                 |                 |                 |
|                 |                 |                 |                 |
|                 |                 |                 |     "ports": [{ |
|                 |                 |                 |           "pr   |
|                 |                 |                 | otocol": "TCP", |
|                 |                 |                 |           "con  |
|                 |                 |                 | tainerPort": 80 |
|                 |                 |                 |       }]        |
+-----------------+-----------------+-----------------+-----------------+
| port            | body            | integer         | The port to     |
| s.containerPort |                 |                 | open in         |
| (Optional)      |                 |                 | container.      |
|                 |                 |                 | Its value must  |
|                 |                 |                 | be a number     |
|                 |                 |                 | between 1 and   |
|                 |                 |                 | 65535.          |
+-----------------+-----------------+-----------------+-----------------+
| ports.protocol  | body            | string          | The protocol.   |
| (Optional)      |                 |                 | Its value can   |
|                 |                 |                 | be TCP or UDP.  |
|                 |                 |                 | Default is TCP. |
+-----------------+-----------------+-----------------+-----------------+
| resources       | body            | object          | Compute         |
| (Optional)      |                 |                 | Resources       |
|                 |                 |                 | required by     |
|                 |                 |                 | this container. |
|                 |                 |                 | Supported       |
|                 |                 |                 | compute         |
|                 |                 |                 | resources are   |
|                 |                 |                 | cpu and memory. |
|                 |                 |                 | An example      |
|                 |                 |                 | format would    |
|                 |                 |                 | look as         |
|                 |                 |                 | follows:        |
|                 |                 |                 |                 |
|                 |                 |                 |                 |
|                 |                 |                 |  "resources": { |
|                 |                 |                 |                 |
|                 |                 |                 |   "requests": { |
|                 |                 |                 |                 |
|                 |                 |                 |     "cpu": 0.1, |
|                 |                 |                 |                 |
|                 |                 |                 |   "memory": 128 |
|                 |                 |                 |       }}        |
+-----------------+-----------------+-----------------+-----------------+
| resources.cpu   | body            | float           | The number of   |
| (Optional)      |                 |                 | virtual CPU.    |
+-----------------+-----------------+-----------------+-----------------+
| r               | body            | integer         | The amount of   |
| esources.memory |                 |                 | memory in MiB.  |
| (Optional)      |                 |                 |                 |
+-----------------+-----------------+-----------------+-----------------+
| volumeMounts    | body            | array           | List of volumes |
| (Optional)      |                 |                 | to mount into   |
|                 |                 |                 | the container’s |
|                 |                 |                 | filesystem.     |
|                 |                 |                 | Each item must  |
|                 |                 |                 | contain a name  |
|                 |                 |                 | key and a       |
|                 |                 |                 | mountPath key.  |
|                 |                 |                 | An example      |
|                 |                 |                 | format would    |
|                 |                 |                 | look as         |
|                 |                 |                 | follows:        |
|                 |                 |                 |                 |
|                 |                 |                 |       "vo       |
|                 |                 |                 | lumeMounts": [{ |
|                 |                 |                 |                 |
|                 |                 |                 |      "mountPath |
|                 |                 |                 | ": "/work-dir", |
|                 |                 |                 |           "n    |
|                 |                 |                 | ame": "workdir" |
|                 |                 |                 |       }]        |
+-----------------+-----------------+-----------------+-----------------+
| vo              | body            | string          | The name of the |
| lumeMounts.name |                 |                 | volume          |
| (Optional)      |                 |                 |                 |
+-----------------+-----------------+-----------------+-----------------+
| volumeM         | body            | string          | The path within |
| ounts.mountPath |                 |                 | the container   |
| (Optional)      |                 |                 | at which the    |
|                 |                 |                 | volume should   |
|                 |                 |                 | be mounted.     |
+-----------------+-----------------+-----------------+-----------------+
| workDir         | body            | string          | The working     |
| (Optional)      |                 |                 | directory for   |
|                 |                 |                 | commands to run |
|                 |                 |                 | in.             |
+-----------------+-----------------+-----------------+-----------------+

Capsule Volume¶

+-----------------+-----------------+-----------------+-----------------+
| Name            | In              | Type            | Description     |
+=================+=================+=================+=================+
| name            | body            | string          | The name of the |
|                 |                 |                 | volume.         |
+-----------------+-----------------+-----------------+-----------------+
| cinder          | body            | object          | The Cinder      |
|                 |                 |                 | volume          |
|                 |                 |                 | configuration.  |
|                 |                 |                 | There are two   |
|                 |                 |                 | options to      |
|                 |                 |                 | configure the   |
|                 |                 |                 | volume: use an  |
|                 |                 |                 | existing volume |
|                 |                 |                 | or dynamically  |
|                 |                 |                 | create one.     |
|                 |                 |                 | To specify an   |
|                 |                 |                 | existing        |
|                 |                 |                 | volume, set the |
|                 |                 |                 | volumeID key    |
|                 |                 |                 | with            |
|                 |                 |                 | the UUID of the |
|                 |                 |                 | Cinder volume   |
|                 |                 |                 | as value. For   |
|                 |                 |                 | example:        |
|                 |                 |                 |                 |
|                 |                 |                 |                 |
|                 |                 |                 |     "cinder": { |
|                 |                 |                 |                 |
|                 |                 |                 |          "volum |
|                 |                 |                 | eID": "9e5b5387 |
|                 |                 |                 | -ed3b-4b9d-ab1e |
|                 |                 |                 | -0ce1e9dd86a1", |
|                 |                 |                 |           "aut  |
|                 |                 |                 | oRemove": false |
|                 |                 |                 |       }         |
|                 |                 |                 |                 |
|                 |                 |                 | To create a     |
|                 |                 |                 | volume, set the |
|                 |                 |                 | size key with   |
|                 |                 |                 | its size as     |
|                 |                 |                 | value.          |
|                 |                 |                 | For example:    |
|                 |                 |                 |                 |
|                 |                 |                 |                 |
|                 |                 |                 |     "cinder": { |
|                 |                 |                 |                 |
|                 |                 |                 |      "size": 1, |
|                 |                 |                 |           "au   |
|                 |                 |                 | toRemove": true |
|                 |                 |                 |       }         |
|                 |                 |                 |                 |
|                 |                 |                 | The autoRemove  |
|                 |                 |                 | key is optional |
|                 |                 |                 | for deciding    |
|                 |                 |                 | the cleanup of  |
|                 |                 |                 | the             |
|                 |                 |                 | volume.         |
+-----------------+-----------------+-----------------+-----------------+
| cinder.volumeID | body            | string          | The UUID of the |
| (Optional)      |                 |                 | Cinder volume.  |
+-----------------+-----------------+-----------------+-----------------+
| cinder.size     | body            | string          | The size of the |
| (Optional)      |                 |                 | Cinder volume.  |
+-----------------+-----------------+-----------------+-----------------+
| ci              | body            | string          | Whether to      |
| nder.autoRemove |                 |                 | remove the      |
| (Optional)      |                 |                 | volume when the |
|                 |                 |                 | capsule is      |
|                 |                 |                 | deleted.        |
+-----------------+-----------------+-----------------+-----------------+

Request Example¶

    {
        "template": {
            "kind": "capsule",
            "spec": {
                "restartPolicy": "Always",
                "initContainers": [
                    {
                        "workDir": "/",
                        "command": [
                            "wget",
                            "-O",
                            "/work-dir/index.html",
                            "https://www.openstack.org/"
                        ],
                        "env": {
                            "ENV1": "env1-value1"
                        },
                        "image": "busybox",
                        "volumeMounts": [
                            {
                                "mountPath": "/work-dir",
                                "name": "workdir"
                            }
                        ],
                        "resources": {
                            "requests": {
                                "cpu": 0.1,
                                "memory": 128
                            }
                        }
                    }
                ],
                "containers": [
                    {
                        "workDir": "/",
                        "env": {
                            "ENV2": "env2-value"
                        },
                        "image": "nginx",
                        "volumeMounts": [
                            {
                                "mountPath": "/usr/share/nginx/html",
                                "name": "workdir"
                            }
                        ],
                        "ports": [
                            {
                                "protocol": "TCP",
                                "containerPort": 80
                            }
                        ],
                        "resources": {
                            "requests": {
                                "cpu": 0.5,
                                "memory": 512
                            }
                        }
                    }
                ],
                "volumes": [
                    {
                        "cinder": {
                            "size": 1
                        },
                        "name": "workdir"
                    }
                ]
            },
            "metadata": {
                "labels": {
                    "app": "web"
                },
                "name": "demo",
                "annotations": {
                    "key1": "value1"
                },
            }
        }
    }

Response¶

Capsule¶

+-----------------+-----------------+-----------------+-----------------+
| Name            | In              | Type            | Description     |
+=================+=================+=================+=================+
| addresses       | body            | string          | IP address of   |
|                 |                 |                 | the capsule.    |
|                 |                 |                 | This includes   |
|                 |                 |                 | both ipv4       |
|                 |                 |                 | and/or ipv6     |
|                 |                 |                 | addresses.      |
+-----------------+-----------------+-----------------+-----------------+
| containers      | body            | object          | List of         |
|                 |                 |                 | containers      |
|                 |                 |                 | belonging       |
|                 |                 |                 | to the capsule. |
|                 |                 |                 | There must be   |
|                 |                 |                 | at least one    |
|                 |                 |                 | container in a  |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| cpu             | body            | float           | The number of   |
|                 |                 |                 | virtual cpus of |
|                 |                 |                 | the capsule.    |
+-----------------+-----------------+-----------------+-----------------+
| memory          | body            | string          | The capsule     |
|                 |                 |                 | memory size in  |
|                 |                 |                 | MiB.            |
+-----------------+-----------------+-----------------+-----------------+
| uuid            | body            | string          | The UUID of the |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| name            | body            | string          | The name of the |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| labels          | body            | object          | The labels of   |
|                 |                 |                 | the capsule.    |
+-----------------+-----------------+-----------------+-----------------+
| annotations     | body            | object          | The annotations |
|                 |                 |                 | of the capsule. |
|                 |                 |                 | Annotations is  |
|                 |                 |                 | an unstructured |
|                 |                 |                 | key value map   |
|                 |                 |                 | stored with a   |
|                 |                 |                 | resource        |
|                 |                 |                 | that may be set |
|                 |                 |                 | by external     |
|                 |                 |                 | tools to store  |
|                 |                 |                 | and retrieve    |
|                 |                 |                 | arbitrary       |
|                 |                 |                 | metadata.       |
+-----------------+-----------------+-----------------+-----------------+
| restart_policy  | body            | object          | Restart policy  |
|                 |                 |                 | for all         |
|                 |                 |                 | containers      |
|                 |                 |                 | within the      |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| created_at      | body            | string          | The date and    |
|                 |                 |                 | time when the   |
|                 |                 |                 | resource was    |
|                 |                 |                 | created.        |
|                 |                 |                 |                 |
|                 |                 |                 | The date and    |
|                 |                 |                 | time stamp      |
|                 |                 |                 | format is ISO   |
|                 |                 |                 | 8601:           |
|                 |                 |                 |                 |
|                 |                 |                 |     CCYY-MM-DD  |
|                 |                 |                 | Thh:mm:ss±hh:mm |
|                 |                 |                 |                 |
|                 |                 |                 | For example,    |
|                 |                 |                 | 2015-08-27T     |
|                 |                 |                 | 09:49:58-05:00. |
|                 |                 |                 |                 |
|                 |                 |                 | The ±hh:mm      |
|                 |                 |                 | value, if       |
|                 |                 |                 | included, is    |
|                 |                 |                 | the time zone   |
|                 |                 |                 | as an offset    |
|                 |                 |                 | from UTC.       |
+-----------------+-----------------+-----------------+-----------------+
| updated_at      | body            | string          | The date and    |
|                 |                 |                 | time when the   |
|                 |                 |                 | resource was    |
|                 |                 |                 | updated.        |
|                 |                 |                 |                 |
|                 |                 |                 | The date and    |
|                 |                 |                 | time stamp      |
|                 |                 |                 | format is ISO   |
|                 |                 |                 | 8601:           |
|                 |                 |                 |                 |
|                 |                 |                 |     CCYY-MM-DD  |
|                 |                 |                 | Thh:mm:ss±hh:mm |
|                 |                 |                 |                 |
|                 |                 |                 | For example,    |
|                 |                 |                 | 2015-08-27T     |
|                 |                 |                 | 09:49:58-05:00. |
|                 |                 |                 |                 |
|                 |                 |                 | The ±hh:mm      |
|                 |                 |                 | value, if       |
|                 |                 |                 | included, is    |
|                 |                 |                 | the time zone   |
|                 |                 |                 | as an offset    |
|                 |                 |                 | from UTC. In    |
|                 |                 |                 | the previous    |
|                 |                 |                 | example, the    |
|                 |                 |                 | offset value is |
|                 |                 |                 | -05:00.         |
|                 |                 |                 |                 |
|                 |                 |                 | If the          |
|                 |                 |                 | updated_at date |
|                 |                 |                 | and time stamp  |
|                 |                 |                 | is not set, its |
|                 |                 |                 | value is        |
|                 |                 |                 | null.           |
+-----------------+-----------------+-----------------+-----------------+
| user_id         | body            | string          | The user ID of  |
|                 |                 |                 | the user who    |
|                 |                 |                 | owns the        |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| project_id      | body            | string          | The UUID of the |
|                 |                 |                 | project to      |
|                 |                 |                 | which this      |
|                 |                 |                 | capsule         |
|                 |                 |                 | belongs.        |
+-----------------+-----------------+-----------------+-----------------+
| status          | body            | string          | The current     |
|                 |                 |                 | state of the    |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| status_reason   | body            | string          | The reason of   |
|                 |                 |                 | capsule current |
|                 |                 |                 | status.         |
+-----------------+-----------------+-----------------+-----------------+
| links           | body            | string          | A list of       |
|                 |                 |                 | relative links. |
+-----------------+-----------------+-----------------+-----------------+

Capsule Container¶

+-----------------+-----------------+-----------------+-----------------+
| Name            | In              | Type            | Description     |
+=================+=================+=================+=================+
| addresses       | body            | string          | IP address of   |
|                 |                 |                 | the container.  |
|                 |                 |                 | This includes   |
|                 |                 |                 | both ipv4       |
|                 |                 |                 | and/or ipv6     |
|                 |                 |                 | addresses.      |
+-----------------+-----------------+-----------------+-----------------+
| image           | body            | string          | The name or ID  |
|                 |                 |                 | of the image.   |
+-----------------+-----------------+-----------------+-----------------+
| labels          | body            | object          | A map of labels |
|                 |                 |                 | of the          |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| disk            | body            | integer         | The container   |
|                 |                 |                 | disk size in    |
|                 |                 |                 | GiB.            |
+-----------------+-----------------+-----------------+-----------------+
| security_groups | body            | string          | Security groups |
|                 |                 |                 | to be added to  |
|                 |                 |                 | the container.  |
+-----------------+-----------------+-----------------+-----------------+
| task_state      | body            | string          | The current     |
|                 |                 |                 | task of the     |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| user_id         | body            | string          | The user ID of  |
|                 |                 |                 | the user who    |
|                 |                 |                 | owns the        |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| uuid            | body            | string          | The UUID of the |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| hostname        | body            | string          | The hostname of |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| environment     | body            | object          | The environment |
|                 |                 |                 | variables to    |
|                 |                 |                 | set in the      |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| memory          | body            | integer         | The container   |
|                 |                 |                 | memory size in  |
|                 |                 |                 | MiB.            |
+-----------------+-----------------+-----------------+-----------------+
| project_id      | body            | array           | The UUID of the |
|                 |                 |                 | project to      |
|                 |                 |                 | which this      |
|                 |                 |                 | container       |
|                 |                 |                 | belongs.        |
+-----------------+-----------------+-----------------+-----------------+
| status          | body            | string          | The current     |
|                 |                 |                 | state of the    |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| environment     | body            | object          | The environment |
|                 |                 |                 | variables to    |
|                 |                 |                 | set in the      |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| workdir         | body            | string          | The working     |
|                 |                 |                 | directory for   |
|                 |                 |                 | commands to run |
|                 |                 |                 | in.             |
+-----------------+-----------------+-----------------+-----------------+
| healthcheck     | body            | object          | A dict of       |
|                 |                 |                 | health check    |
|                 |                 |                 | for the         |
|                 |                 |                 | container.      |
|                 |                 |                 | Specify a test  |
|                 |                 |                 | command to      |
|                 |                 |                 | perform to      |
|                 |                 |                 | check that the  |
|                 |                 |                 | container is    |
|                 |                 |                 | healthy. Four   |
|                 |                 |                 | parameters are  |
|                 |                 |                 | supported:      |
|                 |                 |                 |                 |
|                 |                 |                 | -   cmd:        |
|                 |                 |                 |     Command to  |
|                 |                 |                 |     run to      |
|                 |                 |                 |     check       |
|                 |                 |                 |     health.     |
|                 |                 |                 |                 |
|                 |                 |                 | -   interval:   |
|                 |                 |                 |     Time        |
|                 |                 |                 |     between     |
|                 |                 |                 |     running the |
|                 |                 |                 |     check in    |
|                 |                 |                 |     seconds.    |
|                 |                 |                 |                 |
|                 |                 |                 | -   retries:    |
|                 |                 |                 |     Consecutive |
|                 |                 |                 |     failures    |
|                 |                 |                 |     needed to   |
|                 |                 |                 |     report      |
|                 |                 |                 |     unhealthy.  |
|                 |                 |                 |                 |
|                 |                 |                 | -   timeout:    |
|                 |                 |                 |     Maximum     |
|                 |                 |                 |     time to     |
|                 |                 |                 |     allow one   |
|                 |                 |                 |     check to    |
|                 |                 |                 |     run in      |
|                 |                 |                 |     seconds.    |
+-----------------+-----------------+-----------------+-----------------+
| auto_remove     | body            | boolean         | Enable          |
|                 |                 |                 | auto-removal of |
|                 |                 |                 | the container   |
|                 |                 |                 | on daemon side  |
|                 |                 |                 | when the        |
|                 |                 |                 | container’s     |
|                 |                 |                 | process exits.  |
+-----------------+-----------------+-----------------+-----------------+
| auto_heal       | body            | boolean         | The flag of     |
|                 |                 |                 | healing         |
|                 |                 |                 | non-existent    |
|                 |                 |                 | container in    |
|                 |                 |                 | docker.         |
+-----------------+-----------------+-----------------+-----------------+
| cpu_policy      | body            | string          | The CPU policy  |
|                 |                 |                 | of the          |
|                 |                 |                 | container. Its  |
|                 |                 |                 | value can be    |
|                 |                 |                 | dedicated or    |
|                 |                 |                 | shared.         |
+-----------------+-----------------+-----------------+-----------------+
| image_driver    | body            | string          | The image       |
|                 |                 |                 | driver to use   |
|                 |                 |                 | to pull         |
|                 |                 |                 | container       |
|                 |                 |                 | image.          |
+-----------------+-----------------+-----------------+-----------------+
| status_detail   | body            | string          | The status      |
|                 |                 |                 | detail of the   |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| status_reason   | body            | string          | The reason of   |
|                 |                 |                 | container       |
|                 |                 |                 | current status. |
+-----------------+-----------------+-----------------+-----------------+
| name            | body            | string          | The name of the |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| restart_policy  | body            | object          | Restart policy  |
|                 |                 |                 | to apply when a |
|                 |                 |                 | container       |
|                 |                 |                 | exits. It must  |
|                 |                 |                 | contain a       |
|                 |                 |                 | Name key and    |
|                 |                 |                 | its allowed     |
|                 |                 |                 | values are no,  |
|                 |                 |                 | on-failure,     |
|                 |                 |                 | always,         |
|                 |                 |                 | unless-stopped. |
|                 |                 |                 | Optionally, it  |
|                 |                 |                 | can contain a   |
|                 |                 |                 | Ma              |
|                 |                 |                 | ximumRetryCount |
|                 |                 |                 | key             |
|                 |                 |                 | and its value   |
|                 |                 |                 | is an integer.  |
+-----------------+-----------------+-----------------+-----------------+
| cpu             | body            | float           | The number of   |
|                 |                 |                 | virtual cpus of |
|                 |                 |                 | the container.  |
+-----------------+-----------------+-----------------+-----------------+
| command         | body            | array           | Send command to |
|                 |                 |                 | the container.  |
+-----------------+-----------------+-----------------+-----------------+
| registry_id     | body            | string          | The ID of the   |
|                 |                 |                 | image registry  |
|                 |                 |                 | used by the     |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| ports           | body            | string          | The ports       |
|                 |                 |                 | exposed on the  |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| interactive     | body            | boolean         | Keep STDIN open |
|                 |                 |                 | even if not     |
|                 |                 |                 | attached.       |
+-----------------+-----------------+-----------------+-----------------+
| tty             | body            | boolean         | Whether this    |
|                 |                 |                 | container       |
|                 |                 |                 | allocate a TTY  |
|                 |                 |                 | for itself.     |
+-----------------+-----------------+-----------------+-----------------+

Response Example¶

    {
        "status": "Creating",
        "user_id": "c863491f37984815bf740836c86e9310",
        "uuid": "a4bad62a-f3ba-4b14-b2ab-2af470a2f32c",
        "links": [
            {
                "href": "http://openstack.example.com/v1/capsules/a4bad62a-f3ba-4b14-b2ab-2af470a2f32c",
                "rel": "self"
            },
            {
                "href": "http://openstack.example.com/capsules/a4bad62a-f3ba-4b14-b2ab-2af470a2f32c",
                "rel": "bookmark"
            }
        ],
        "created_at": "2019-05-18 21:02:12.304734",
        "labels": {
            "app": "web"
        },
        "annotations": {
            "key1": "value1"
        },
        "restart_policy": {
            "MaximumRetryCount": "0",
            "Name": "always"
        },
        "updated_at": null,
        "name": "demo",
        "memory": "512",
        "project_id": "493378c3aa3e4315a39fe8b125f9eaaa",
        "status_reason": null,
        "cpu": 0.5,
        "containers": [
            {
                "addresses": {},
                "image": "nginx",
                "labels": {},
                "disk": 0,
                "security_groups": [],
                "task_state": null,
                "user_id": "c863491f37984815bf740836c86e9310",
                "uuid": "6df062d2-293c-4c35-af81-22d27ce47887",
                "hostname": null,
                "environment": {
                    "ENV2": "env2-value"
                },
                "memory": "512",
                "project_id": "493378c3aa3e4315a39fe8b125f9eaaa",
                "status": "Creating",
                "workdir": "/",
                "healthcheck": {},
                "auto_remove": false,
                "auto_heal": false,
                "cpu_policy": "shared",
                "image_driver": null,
                "status_detail": null,
                "status_reason": null,
                "name": "capsule-demo-pi-9",
                "restart_policy": {
                    "MaximumRetryCount": "10",
                    "Name": "on-failure"
                },
                "cpu": 0.5,
                "command": [],
                "registry_id": null,
                "ports": [],
                "interactive": true
            }
        ],
        "addresses": null
    }

GET

/v1/capsules/

List all capsules

detail

List all available capsules in Zun.

Response Codes¶

Success¶

  Code       Reason
  ---------- -------------------------
  200 - OK   Request was successful.

Error¶

  Code                 Reason
  -------------------- ----------------------------------------------------------
  401 - Unauthorized   User must authenticate before making a request.
  403 - Forbidden      Policy does not allow current user to do this operation.

Request¶

This request does not contain anything in the request body.

Response¶

Capsule¶

+-----------------+-----------------+-----------------+-----------------+
| Name            | In              | Type            | Description     |
+=================+=================+=================+=================+
| addresses       | body            | string          | IP address of   |
|                 |                 |                 | the capsule.    |
|                 |                 |                 | This includes   |
|                 |                 |                 | both ipv4       |
|                 |                 |                 | and/or ipv6     |
|                 |                 |                 | addresses.      |
+-----------------+-----------------+-----------------+-----------------+
| containers      | body            | object          | List of         |
|                 |                 |                 | containers      |
|                 |                 |                 | belonging       |
|                 |                 |                 | to the capsule. |
|                 |                 |                 | There must be   |
|                 |                 |                 | at least one    |
|                 |                 |                 | container in a  |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| cpu             | body            | float           | The number of   |
|                 |                 |                 | virtual cpus of |
|                 |                 |                 | the capsule.    |
+-----------------+-----------------+-----------------+-----------------+
| memory          | body            | string          | The capsule     |
|                 |                 |                 | memory size in  |
|                 |                 |                 | MiB.            |
+-----------------+-----------------+-----------------+-----------------+
| uuid            | body            | string          | The UUID of the |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| name            | body            | string          | The name of the |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| labels          | body            | object          | The labels of   |
|                 |                 |                 | the capsule.    |
+-----------------+-----------------+-----------------+-----------------+
| annotations     | body            | object          | The annotations |
|                 |                 |                 | of the capsule. |
|                 |                 |                 | Annotations is  |
|                 |                 |                 | an unstructured |
|                 |                 |                 | key value map   |
|                 |                 |                 | stored with a   |
|                 |                 |                 | resource        |
|                 |                 |                 | that may be set |
|                 |                 |                 | by external     |
|                 |                 |                 | tools to store  |
|                 |                 |                 | and retrieve    |
|                 |                 |                 | arbitrary       |
|                 |                 |                 | metadata.       |
+-----------------+-----------------+-----------------+-----------------+
| restart_policy  | body            | object          | Restart policy  |
|                 |                 |                 | for all         |
|                 |                 |                 | containers      |
|                 |                 |                 | within the      |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| created_at      | body            | string          | The date and    |
|                 |                 |                 | time when the   |
|                 |                 |                 | resource was    |
|                 |                 |                 | created.        |
|                 |                 |                 |                 |
|                 |                 |                 | The date and    |
|                 |                 |                 | time stamp      |
|                 |                 |                 | format is ISO   |
|                 |                 |                 | 8601:           |
|                 |                 |                 |                 |
|                 |                 |                 |     CCYY-MM-DD  |
|                 |                 |                 | Thh:mm:ss±hh:mm |
|                 |                 |                 |                 |
|                 |                 |                 | For example,    |
|                 |                 |                 | 2015-08-27T     |
|                 |                 |                 | 09:49:58-05:00. |
|                 |                 |                 |                 |
|                 |                 |                 | The ±hh:mm      |
|                 |                 |                 | value, if       |
|                 |                 |                 | included, is    |
|                 |                 |                 | the time zone   |
|                 |                 |                 | as an offset    |
|                 |                 |                 | from UTC.       |
+-----------------+-----------------+-----------------+-----------------+
| updated_at      | body            | string          | The date and    |
|                 |                 |                 | time when the   |
|                 |                 |                 | resource was    |
|                 |                 |                 | updated.        |
|                 |                 |                 |                 |
|                 |                 |                 | The date and    |
|                 |                 |                 | time stamp      |
|                 |                 |                 | format is ISO   |
|                 |                 |                 | 8601:           |
|                 |                 |                 |                 |
|                 |                 |                 |     CCYY-MM-DD  |
|                 |                 |                 | Thh:mm:ss±hh:mm |
|                 |                 |                 |                 |
|                 |                 |                 | For example,    |
|                 |                 |                 | 2015-08-27T     |
|                 |                 |                 | 09:49:58-05:00. |
|                 |                 |                 |                 |
|                 |                 |                 | The ±hh:mm      |
|                 |                 |                 | value, if       |
|                 |                 |                 | included, is    |
|                 |                 |                 | the time zone   |
|                 |                 |                 | as an offset    |
|                 |                 |                 | from UTC. In    |
|                 |                 |                 | the previous    |
|                 |                 |                 | example, the    |
|                 |                 |                 | offset value is |
|                 |                 |                 | -05:00.         |
|                 |                 |                 |                 |
|                 |                 |                 | If the          |
|                 |                 |                 | updated_at date |
|                 |                 |                 | and time stamp  |
|                 |                 |                 | is not set, its |
|                 |                 |                 | value is        |
|                 |                 |                 | null.           |
+-----------------+-----------------+-----------------+-----------------+
| user_id         | body            | string          | The user ID of  |
|                 |                 |                 | the user who    |
|                 |                 |                 | owns the        |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| project_id      | body            | string          | The UUID of the |
|                 |                 |                 | project to      |
|                 |                 |                 | which this      |
|                 |                 |                 | capsule         |
|                 |                 |                 | belongs.        |
+-----------------+-----------------+-----------------+-----------------+
| status          | body            | string          | The current     |
|                 |                 |                 | state of the    |
|                 |                 |                 | capsule.        |
+-----------------+-----------------+-----------------+-----------------+
| status_reason   | body            | string          | The reason of   |
|                 |                 |                 | capsule current |
|                 |                 |                 | status.         |
+-----------------+-----------------+-----------------+-----------------+
| links           | body            | string          | A list of       |
|                 |                 |                 | relative links. |
+-----------------+-----------------+-----------------+-----------------+

Capsule Container¶

+-----------------+-----------------+-----------------+-----------------+
| Name            | In              | Type            | Description     |
+=================+=================+=================+=================+
| addresses       | body            | string          | IP address of   |
|                 |                 |                 | the container.  |
|                 |                 |                 | This includes   |
|                 |                 |                 | both ipv4       |
|                 |                 |                 | and/or ipv6     |
|                 |                 |                 | addresses.      |
+-----------------+-----------------+-----------------+-----------------+
| image           | body            | string          | The name or ID  |
|                 |                 |                 | of the image.   |
+-----------------+-----------------+-----------------+-----------------+
| labels          | body            | object          | A map of labels |
|                 |                 |                 | of the          |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| disk            | body            | integer         | The container   |
|                 |                 |                 | disk size in    |
|                 |                 |                 | GiB.            |
+-----------------+-----------------+-----------------+-----------------+
| security_groups | body            | string          | Security groups |
|                 |                 |                 | to be added to  |
|                 |                 |                 | the container.  |
+-----------------+-----------------+-----------------+-----------------+
| task_state      | body            | string          | The current     |
|                 |                 |                 | task of the     |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| user_id         | body            | string          | The user ID of  |
|                 |                 |                 | the user who    |
|                 |                 |                 | owns the        |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| uuid            | body            | string          | The UUID of the |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| hostname        | body            | string          | The hostname of |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| environment     | body            | object          | The environment |
|                 |                 |                 | variables to    |
|                 |                 |                 | set in the      |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| memory          | body            | integer         | The container   |
|                 |                 |                 | memory size in  |
|                 |                 |                 | MiB.            |
+-----------------+-----------------+-----------------+-----------------+
| project_id      | body            | array           | The UUID of the |
|                 |                 |                 | project to      |
|                 |                 |                 | which this      |
|                 |                 |                 | container       |
|                 |                 |                 | belongs.        |
+-----------------+-----------------+-----------------+-----------------+
| status          | body            | string          | The current     |
|                 |                 |                 | state of the    |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| environment     | body            | object          | The environment |
|                 |                 |                 | variables to    |
|                 |                 |                 | set in the      |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| workdir         | body            | string          | The working     |
|                 |                 |                 | directory for   |
|                 |                 |                 | commands to run |
|                 |                 |                 | in.             |
+-----------------+-----------------+-----------------+-----------------+
| healthcheck     | body            | object          | A dict of       |
|                 |                 |                 | health check    |
|                 |                 |                 | for the         |
|                 |                 |                 | container.      |
|                 |                 |                 | Specify a test  |
|                 |                 |                 | command to      |
|                 |                 |                 | perform to      |
|                 |                 |                 | check that the  |
|                 |                 |                 | container is    |
|                 |                 |                 | healthy. Four   |
|                 |                 |                 | parameters are  |
|                 |                 |                 | supported:      |
|                 |                 |                 |                 |
|                 |                 |                 | -   cmd:        |
|                 |                 |                 |     Command to  |
|                 |                 |                 |     run to      |
|                 |                 |                 |     check       |
|                 |                 |                 |     health.     |
|                 |                 |                 |                 |
|                 |                 |                 | -   interval:   |
|                 |                 |                 |     Time        |
|                 |                 |                 |     between     |
|                 |                 |                 |     running the |
|                 |                 |                 |     check in    |
|                 |                 |                 |     seconds.    |
|                 |                 |                 |                 |
|                 |                 |                 | -   retries:    |
|                 |                 |                 |     Consecutive |
|                 |                 |                 |     failures    |
|                 |                 |                 |     needed to   |
|                 |                 |                 |     report      |
|                 |                 |                 |     unhealthy.  |
|                 |                 |                 |                 |
|                 |                 |                 | -   timeout:    |
|                 |                 |                 |     Maximum     |
|                 |                 |                 |     time to     |
|                 |                 |                 |     allow one   |
|                 |                 |                 |     check to    |
|                 |                 |                 |     run in      |
|                 |                 |                 |     seconds.    |
+-----------------+-----------------+-----------------+-----------------+
| auto_remove     | body            | boolean         | Enable          |
|                 |                 |                 | auto-removal of |
|                 |                 |                 | the container   |
|                 |                 |                 | on daemon side  |
|                 |                 |                 | when the        |
|                 |                 |                 | container’s     |
|                 |                 |                 | process exits.  |
+-----------------+-----------------+-----------------+-----------------+
| auto_heal       | body            | boolean         | The flag of     |
|                 |                 |                 | healing         |
|                 |                 |                 | non-existent    |
|                 |                 |                 | container in    |
|                 |                 |                 | docker.         |
+-----------------+-----------------+-----------------+-----------------+
| cpu_policy      | body            | string          | The CPU policy  |
|                 |                 |                 | of the          |
|                 |                 |                 | container. Its  |
|                 |                 |                 | value can be    |
|                 |                 |                 | dedicated or    |
|                 |                 |                 | shared.         |
+-----------------+-----------------+-----------------+-----------------+
| image_driver    | body            | string          | The image       |
|                 |                 |                 | driver to use   |
|                 |                 |                 | to pull         |
|                 |                 |                 | container       |
|                 |                 |                 | image.          |
+-----------------+-----------------+-----------------+-----------------+
| status_detail   | body            | string          | The status      |
|                 |                 |                 | detail of the   |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| status_reason   | body            | string          | The reason of   |
|                 |                 |                 | container       |
|                 |                 |                 | current status. |
+-----------------+-----------------+-----------------+-----------------+
| name            | body            | string          | The name of the |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| restart_policy  | body            | object          | Restart policy  |
|                 |                 |                 | to apply when a |
|                 |                 |                 | container       |
|                 |                 |                 | exits. It must  |
|                 |                 |                 | contain a       |
|                 |                 |                 | Name key and    |
|                 |                 |                 | its allowed     |
|                 |                 |                 | values are no,  |
|                 |                 |                 | on-failure,     |
|                 |                 |                 | always,         |
|                 |                 |                 | unless-stopped. |
|                 |                 |                 | Optionally, it  |
|                 |                 |                 | can contain a   |
|                 |                 |                 | Ma              |
|                 |                 |                 | ximumRetryCount |
|                 |                 |                 | key             |
|                 |                 |                 | and its value   |
|                 |                 |                 | is an integer.  |
+-----------------+-----------------+-----------------+-----------------+
| cpu             | body            | float           | The number of   |
|                 |                 |                 | virtual cpus of |
|                 |                 |                 | the container.  |
+-----------------+-----------------+-----------------+-----------------+
| command         | body            | array           | Send command to |
|                 |                 |                 | the container.  |
+-----------------+-----------------+-----------------+-----------------+
| registry_id     | body            | string          | The ID of the   |
|                 |                 |                 | image registry  |
|                 |                 |                 | used by the     |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| ports           | body            | string          | The ports       |
|                 |                 |                 | exposed on the  |
|                 |                 |                 | container.      |
+-----------------+-----------------+-----------------+-----------------+
| interactive     | body            | boolean         | Keep STDIN open |
|                 |                 |                 | even if not     |
|                 |                 |                 | attached.       |
+-----------------+-----------------+-----------------+-----------------+
| tty             | body            | boolean         | Whether this    |
|                 |                 |                 | container       |
|                 |                 |                 | allocate a TTY  |
|                 |                 |                 | for itself.     |
+-----------------+-----------------+-----------------+-----------------+

Response Example¶

    {
        "capsules": [
            {
                "status": "Running",
                "user_id": "c863491f37984815bf740836c86e9310",
                "uuid": "a4bad62a-f3ba-4b14-b2ab-2af470a2f32c",
                "links": [
                    {
                        "href": "http://openstack.example.com/v1/capsules/a4bad62a-f3ba-4b14-b2ab-2af470a2f32c",
                        "rel": "self"
                    },
                    {
                        "href": "http://openstack.example.com/capsules/a4bad62a-f3ba-4b14-b2ab-2af470a2f32c",
                        "rel": "bookmark"
                    }
                ],
                "created_at": "2019-05-18 21:02:12",
                "labels": {
                    "app": "web"
                },
                "annotations": {
                    "key1": "value1"
                },
                "restart_policy": {
                    "MaximumRetryCount": "0",
                    "Name": "always"
                },
                "updated_at": "2019-05-18 21:02:30",
                "name": "demo",
                "memory": "512",
                "project_id": "493378c3aa3e4315a39fe8b125f9eaaa",
                "status_reason": null,
                "cpu": 0.5,
                "containers": [
                    {
                        "addresses": {},
                        "image": "nginx",
                        "labels": {},
                        "disk": 0,
                        "security_groups": [],
                        "task_state": null,
                        "user_id": "c863491f37984815bf740836c86e9310",
                        "uuid": "6df062d2-293c-4c35-af81-22d27ce47887",
                        "hostname": "dce8bbff358a",
                        "environment": {
                            "ENV2": "env2-value"
                        },
                        "memory": "512",
                        "project_id": "493378c3aa3e4315a39fe8b125f9eaaa",
                        "status": "Running",
                        "workdir": "/",
                        "healthcheck": {},
                        "auto_remove": false,
                        "auto_heal": false,
                        "cpu_policy": "shared",
                        "image_driver": null,
                        "status_detail": null,
                        "status_reason": null,
                        "name": "capsule-demo-pi-9",
                        "restart_policy": {
                            "MaximumRetryCount": "10",
                            "Name": "on-failure"
                        },
                        "cpu": 0.5,
                        "command": [
                            "nginx",
                            "-g",
                            "daemon off;"
                        ],
                        "registry_id": null,
                        "ports": [
                            80
                        ],
                        "interactive": true,
                        "tty": true
                    }
                ],
                "addresses": {
                    "86f0b398-414f-4e6a-b569-21d3452eb769": [
                        {
                            "subnet_id": "48bdf0e5-49d0-4668-9dcf-c47ea69fb4c3",
                            "version": 4,
                            "preserve_on_delete": false,
                            "addr": "10.0.0.21",
                            "port": "d19617f2-6984-4c00-a914-da02b39fdc52"
                        },
                        {
                            "subnet_id": "54f53848-66fc-4697-ab31-a97579691312",
                            "version": 6,
                            "preserve_on_delete": false,
                            "addr": "fddf:ec1e:34b4:0:f816:3eff:feb3:6c0e",
                            "port": "d19617f2-6984-4c00-a914-da02b39fdc52"
                        }
                    ]
                }
            }
        ],
        "next": null
    }


+ cd -
/tmp/os_docs_temp
+ '[' '' == all ']'
+ rm -rf '/tmp/os_docs_temp/openstack-docs-plaintext/neutron-lib/2025.2*/_static/' '/tmp/os_docs_temp/openstack-docs-plaintext/neutron-lib/2025.2*/.doctrees/'

+ echo
+ for log_file in "${LOG_FILES[@]}"
+ echo '-- /tmp/nova_5m587.log ---------------------------------------'
+ cat /tmp/nova_5m587.log
-- /tmp/nova_5m587.log ---------------------------------------
+ local project=nova
+ local _os_version=2025.2
+ local 'tox_text_docs_target=

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
'
+ local 'tox_text_api_ref_target=
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ echo 'Generating the plain-text documentation for OpenStack nova'
Generating the plain-text documentation for OpenStack nova
+ echo 'OS_API_DOCS is set to: true'
OS_API_DOCS is set to: true
+ local branch_prefix=
+ '[' 2025.2 '!=' master ']'
+ branch_prefix=stable/
+ '[' '!' -d nova ']'
+ git clone -v --depth=1 --single-branch -b stable/2025.2 https://opendev.org/openstack/nova.git
Cloning into 'nova'...
POST git-upload-pack (406 bytes)
POST git-upload-pack (194 bytes)
+ cd nova
+ '[' nova == designate ']'
+ '[' nova == ironic ']'
+ '[' nova == heat ']'
+ [[ nova == \t\r\o\v\e ]]
+ [[ nova == \z\a\q\a\r ]]
+ grep -q text-docs tox.ini
+ echo 'The text-docs target does not exist for nova. Appending it...'
The text-docs target does not exist for nova. Appending it...
+ echo '

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
'
+ '[' nova '!=' neutron-lib ']'
+ tox -etext-docs
text-docs: install_deps> python -I -m pip install -chttps://releases.openstack.org/constraints/upper/2025.2 -r /tmp/os_docs_temp/nova/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: install_requires> python -I -m pip install 'pbr>=6.0.0' 'setuptools>=64.0.0'
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_sdist> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: install_requires_for_build_sdist> python -I -m pip install 'pbr>=2.0.0'
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: install_requires_for_build_editable> python -I -m pip install 'pbr>=2.0.0'
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
text-docs: install_package_deps> python -I -m pip install -chttps://releases.openstack.org/constraints/upper/2025.2 'Jinja2>=2.10' 'Paste>=2.0.2' 'PasteDeploy>=1.5.0' 'PrettyTable>=0.7.1' 'PyYAML>=5.1' 'Routes>=2.3.1' 'SQLAlchemy>=1.4.13' 'WebOb>=1.8.2' 'alembic>=1.5.0' 'castellan>=0.16.0' 'cryptography>=2.7' 'cursive>=0.2.1' 'decorator>=4.1.0' 'eventlet>=0.30.1' 'futurist>=1.8.0' 'greenlet>=0.4.15' 'iso8601>=0.1.11' 'jsonschema>=4.0.0' 'keystoneauth1>=3.16.0' 'keystonemiddleware>=4.20.0' 'lxml>=4.5.0' 'microversion-parse>=0.2.1' 'netaddr>=0.7.18' 'openstacksdk>=4.4.0' 'os-brick>=6.10.0' 'os-resource-classes>=1.1.0' 'os-service-types>=1.7.0' 'os-traits>=3.5.0' 'os-vif>=3.1.0' 'oslo.cache>=1.26.0' 'oslo.concurrency>=5.0.1' 'oslo.config>=8.6.0' 'oslo.context>=3.4.0' 'oslo.db>=10.0.0' 'oslo.i18n>=5.1.0' 'oslo.limit>=1.5.0' 'oslo.log>=4.6.1' 'oslo.messaging>=14.1.0' 'oslo.middleware>=3.31.0' 'oslo.policy>=4.5.0' 'oslo.privsep>=2.6.2' 'oslo.reports>=1.18.0' 'oslo.rootwrap>=5.15.0' 'oslo.serialization>=4.2.0' 'oslo.service[threading]>=4.2.0' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=8.0.0' 'oslo.versionedobjects>=1.35.0' 'oslo.vmware>=3.6.0' 'paramiko>=2.7.1' 'pbr>=5.8.0' 'psutil>=3.2.2' 'python-cinderclient>=4.0.1' 'python-dateutil>=2.7.0' 'python-glanceclient>=4.7.0' 'python-neutronclient>=7.1.0' 'requests>=2.25.1' 'retrying>=1.3.3' 'rfc3986>=1.2.0' 'stevedore>=1.20.0' 'tooz>=1.58.0' 'websockify>=0.9.0' 'zVMCloudConnector>=1.3.0; sys_platform != "win32"'
text-docs: install_package> python -I -m pip install -chttps://releases.openstack.org/constraints/upper/2025.2 --force-reinstall --no-deps /tmp/os_docs_temp/nova/.tox/.tmp/package/1/nova-0.0.0-0.editable-py3-none-any.whl
text-docs: commands[0]> sphinx-build --keep-going -j auto -b text doc/source doc/build/text
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: oslo_context.context, urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
making output directory... done
[openstackdocstheme] overriding configured project name (Project name not set) with name extracted from the package (nova); you can disable this behavior with the 'openstackdocs_auto_name' option
[openstackdocstheme] using theme from /tmp/os_docs_temp/nova/.tox/text-docs/lib/python3.11/site-packages/openstackdocstheme/theme
[oslo_config.sphinxconfiggen] reading config generator instructions from /tmp/os_docs_temp/nova/doc/source/../../etc/nova/nova-config-generator.conf
[oslo_config.sphinxconfiggen] writing sample configuration to /tmp/os_docs_temp/nova/doc/source/_static/nova.conf.sample
[oslo_policy.sphinxpolicygen] reading config generator instructions from /tmp/os_docs_temp/nova/doc/source/../../etc/nova/nova-policy-generator.conf
[oslo_policy.sphinxpolicygen] writing sample policy to /tmp/os_docs_temp/nova/doc/source/_static/nova.policy.yaml.sample
building [mo]: targets for 0 po files that are out of date
writing output... 
building [text]: targets for 187 source files that are out of date
updating environment: [new config] 187 added, 0 changed, 0 removed
reading sources... [ 11%] admin/admin-password-injection .. admin/configuration/index
reading sources... [ 22%] admin/configuration/iscsi-offload .. admin/index
reading sources... [ 33%] admin/libvirt-misc .. admin/scheduling
reading sources... [ 44%] admin/secure-boot .. cli/nova-compute
reading sources... [ 56%] cli/nova-conductor .. contributor/blueprints
reading sources... [ 67%] contributor/code-review .. contributor/testing/serial-console
reading sources... [ 78%] contributor/testing/zero-downtime-upgrade .. reference/glossary
reading sources... [ 89%] reference/gmr .. user/boot-instance-using-PXE
loading config file etc/nova/nova-config-generator.conf
reading sources... [100%] user/certificate-validation .. user/wsgi

looking for now-outdated files... none found
pickling environment... done
checking consistency... /tmp/os_docs_temp/nova/doc/source/admin/architecture.rst: document is referenced in multiple toctrees: ['admin/index', 'index'], selecting: index <- admin/architecture
/tmp/os_docs_temp/nova/doc/source/admin/cells.rst: document is referenced in multiple toctrees: ['admin/index', 'index'], selecting: index <- admin/cells
/tmp/os_docs_temp/nova/doc/source/admin/upgrades.rst: document is referenced in multiple toctrees: ['admin/index', 'index'], selecting: index <- admin/upgrades
/tmp/os_docs_temp/nova/doc/source/admin/vendordata.rst: document is referenced in multiple toctrees: ['admin/index', 'index'], selecting: index <- admin/vendordata
/tmp/os_docs_temp/nova/doc/source/contributor/contributing.rst: document is referenced in multiple toctrees: ['index', 'contributor/index'], selecting: index <- contributor/contributing
/tmp/os_docs_temp/nova/doc/source/reference/api-microversion-history.rst: document is referenced in multiple toctrees: ['user/index', 'reference/index'], selecting: user/index <- reference/api-microversion-history
done
preparing documents... done
copying assets... 
copying assets: done
writing output... [ 12%] admin/aggregates .. admin/configuration/samples/api-paste.ini
writing output... [ 25%] admin/configuration/samples/index .. admin/managing-resource-providers
writing output... [ 38%] admin/metadata-service .. admin/troubleshooting/affinity-policy-violated
writing output... [ 50%] admin/troubleshooting/orphaned-allocations .. configuration/extra-specs
writing output... [ 62%] configuration/index .. contributor/testing
writing output... [ 75%] contributor/testing/down-cell .. reference/conductor
writing output... [ 88%] reference/database-migrations .. user/certificate-validation
writing output... [100%] user/feature-classification .. user/wsgi

build succeeded.

The text files are in doc/build/text.
.pkg: _exit> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
  text-docs: OK (48.35=setup[41.73]+cmd[6.62] seconds)
  congratulations :) (48.55 seconds)
+ '[' '' == venv ']'
+ local api_ref_failed=false
+ '[' true = true ']'
+ local api_dir=
+ '[' -d ./api-ref/source ']'
+ api_dir=api-ref
+ '[' -n api-ref ']'
+ echo 'Building API-Ref documentation for nova using api-ref...'
Building API-Ref documentation for nova using api-ref...
+ grep -q text-api-ref tox.ini
+ local adjusted_target
+ adjusted_target='
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ echo '
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ tox -etext-api-ref
text-api-ref: install_deps> python -I -m pip install -chttps://releases.openstack.org/constraints/upper/2025.2 os-api-ref -r /tmp/os_docs_temp/nova/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_sdist> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
text-api-ref: install_package_deps> python -I -m pip install -chttps://releases.openstack.org/constraints/upper/2025.2 'Jinja2>=2.10' 'Paste>=2.0.2' 'PasteDeploy>=1.5.0' 'PrettyTable>=0.7.1' 'PyYAML>=5.1' 'Routes>=2.3.1' 'SQLAlchemy>=1.4.13' 'WebOb>=1.8.2' 'alembic>=1.5.0' 'castellan>=0.16.0' 'cryptography>=2.7' 'cursive>=0.2.1' 'decorator>=4.1.0' 'eventlet>=0.30.1' 'futurist>=1.8.0' 'greenlet>=0.4.15' 'iso8601>=0.1.11' 'jsonschema>=4.0.0' 'keystoneauth1>=3.16.0' 'keystonemiddleware>=4.20.0' 'lxml>=4.5.0' 'microversion-parse>=0.2.1' 'netaddr>=0.7.18' 'openstacksdk>=4.4.0' 'os-brick>=6.10.0' 'os-resource-classes>=1.1.0' 'os-service-types>=1.7.0' 'os-traits>=3.5.0' 'os-vif>=3.1.0' 'oslo.cache>=1.26.0' 'oslo.concurrency>=5.0.1' 'oslo.config>=8.6.0' 'oslo.context>=3.4.0' 'oslo.db>=10.0.0' 'oslo.i18n>=5.1.0' 'oslo.limit>=1.5.0' 'oslo.log>=4.6.1' 'oslo.messaging>=14.1.0' 'oslo.middleware>=3.31.0' 'oslo.policy>=4.5.0' 'oslo.privsep>=2.6.2' 'oslo.reports>=1.18.0' 'oslo.rootwrap>=5.15.0' 'oslo.serialization>=4.2.0' 'oslo.service[threading]>=4.2.0' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=8.0.0' 'oslo.versionedobjects>=1.35.0' 'oslo.vmware>=3.6.0' 'paramiko>=2.7.1' 'pbr>=5.8.0' 'psutil>=3.2.2' 'python-cinderclient>=4.0.1' 'python-dateutil>=2.7.0' 'python-glanceclient>=4.7.0' 'python-neutronclient>=7.1.0' 'requests>=2.25.1' 'retrying>=1.3.3' 'rfc3986>=1.2.0' 'stevedore>=1.20.0' 'tooz>=1.58.0' 'websockify>=0.9.0' 'zVMCloudConnector>=1.3.0; sys_platform != "win32"'
text-api-ref: install_package> python -I -m pip install -chttps://releases.openstack.org/constraints/upper/2025.2 --force-reinstall --no-deps /tmp/os_docs_temp/nova/.tox/.tmp/package/2/nova-0.0.0-0.editable-py3-none-any.whl
text-api-ref: commands[0]> sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
making output directory... done
[openstackdocstheme] overriding configured project name (Project name not set) with name extracted from the package (nova); you can disable this behavior with the 'openstackdocs_auto_name' option
Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`.
[openstackdocstheme] using theme from /tmp/os_docs_temp/nova/.tox/text-api-ref/lib/python3.11/site-packages/openstackdocstheme/theme
building [mo]: targets for 0 po files that are out of date
writing output... 
building [html]: targets for 1 source files that are out of date
updating environment: [new config] 1 added, 0 changed, 0 removed
reading sources... [100%] index

looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
copying assets... 
copying static files... 
Writing evaluated template result to /tmp/os_docs_temp/nova/api-ref/build/html/_static/basic.css
Writing evaluated template result to /tmp/os_docs_temp/nova/api-ref/build/html/_static/documentation_options.js
Writing evaluated template result to /tmp/os_docs_temp/nova/api-ref/build/html/_static/language_data.js
copying static files: done
copying extra files... 
copying extra files: done
copying assets: done

generating indices... genindex done
writing additional pages... search done
dumping search index in English (code: en)... done
dumping object inventory... done
Copying assets: api-site.css, api-site.js
Copying fonts: glyphicons-halflings-regular.ttf, glyphicons-halflings-regular.woff
build succeeded.

The HTML pages are in api-ref/build/html.
.pkg: _exit> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
  text-api-ref: OK (45.06=setup[41.77]+cmd[3.30] seconds)
  congratulations :) (45.21 seconds)
+ '[' false '!=' true ']'
+ echo 'Converting API-Ref HTML to plain text for nova...'
Converting API-Ref HTML to plain text for nova...
+ rm -rf ./api-ref/build/text
+ mkdir -p ./api-ref/build/text
+ converted_count=0
+ IFS=
+ read -r -d '' html_file
++ find ./api-ref/build/html -name '*.html' -type f -print0
+ rel_path=index.html
+ text_file=./api-ref/build/text/index.txt
++ dirname ./api-ref/build/text/index.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/index.html -o ./api-ref/build/text/index.txt
+ converted_count=1
+ IFS=
+ read -r -d '' html_file
+ rel_path=genindex.html
+ text_file=./api-ref/build/text/genindex.txt
++ dirname ./api-ref/build/text/genindex.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/genindex.html -o ./api-ref/build/text/genindex.txt
[WARNING] Duplicate identifier 'index' at input line 197 column 21
+ converted_count=2
+ IFS=
+ read -r -d '' html_file
+ rel_path=search.html
+ text_file=./api-ref/build/text/search.txt
++ dirname ./api-ref/build/text/search.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/search.html -o ./api-ref/build/text/search.txt
+ converted_count=3
+ IFS=
+ read -r -d '' html_file
+ echo 'Converted 3 HTML files to text for nova'
Converted 3 HTML files to text for nova
+ find ./api-ref/build/text -type f -exec grep -l logo-full.svg '{}' +
+ xargs rm -f
+ true
+ find ./api-ref/build/text '(' -name genindex.txt -o -name search.txt ')' -delete
+ rm -rf ./api-ref/build/text/_sources
++ find ./api-ref/build/text -name '*.txt' -type f -size +1k
++ wc -l
+ api_file_count=1
+ '[' 1 -gt 0 ']'
+ echo 'API-Ref: Found 1 content files for nova'
API-Ref: Found 1 content files for nova
+ find ./api-ref/build/text -mindepth 1 -depth -type d -empty -delete
+ '[' '' == venv ']'
+ '[' nova == adjutant ']'
+ '[' nova == cyborg ']'
+ '[' nova == tempest ']'
+ '[' nova == venus ']'
+ _output_version=2025.2
+ local project_output_dir=/tmp/os_docs_temp/openstack-docs-plaintext/nova
+ rm -rf /tmp/os_docs_temp/openstack-docs-plaintext/nova
+ mkdir -p /tmp/os_docs_temp/openstack-docs-plaintext/nova
+ '[' -d doc/build/text ']'
+ cp -r doc/build/text /tmp/os_docs_temp/openstack-docs-plaintext/nova/2025.2_docs
+ '[' true = true ']'
+ '[' false '!=' true ']'
+ '[' -n api-ref ']'
+ '[' -d api-ref/build/text ']'
+ cp -r api-ref/build/text /tmp/os_docs_temp/openstack-docs-plaintext/nova/2025.2_api-ref
+ echo 'API-Ref documentation copied for nova'
API-Ref documentation copied for nova
+ cd -
/tmp/os_docs_temp
+ '[' '' == all ']'
+ rm -rf /tmp/os_docs_temp/openstack-docs-plaintext/nova/2025.2_docs/_static/ /tmp/os_docs_temp/openstack-docs-plaintext/nova/2025.2_docs/.doctrees/
+ echo
+ for log_file in "${LOG_FILES[@]}"
+ echo '-- /tmp/zaqar_RTdwh.log ---------------------------------------'
+ cat /tmp/zaqar_RTdwh.log

-- /tmp/zaqar_RTdwh.log ---------------------------------------
+ local project=zaqar
+ local _os_version=2025.2
+ local 'tox_text_docs_target=

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
'
+ local 'tox_text_api_ref_target=
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ echo 'Generating the plain-text documentation for OpenStack zaqar'
Generating the plain-text documentation for OpenStack zaqar
+ echo 'OS_API_DOCS is set to: true'
OS_API_DOCS is set to: true
+ local branch_prefix=
+ '[' 2025.2 '!=' master ']'
+ branch_prefix=stable/
+ '[' '!' -d zaqar ']'
+ git clone -v --depth=1 --single-branch -b stable/2025.2 https://opendev.org/openstack/zaqar.git
Cloning into 'zaqar'...
POST git-upload-pack (406 bytes)
POST git-upload-pack (194 bytes)
+ cd zaqar
+ '[' zaqar == designate ']'
+ '[' zaqar == ironic ']'
+ '[' zaqar == heat ']'
+ [[ zaqar == \t\r\o\v\e ]]
+ [[ zaqar == \z\a\q\a\r ]]
+ tox_text_docs_target+='  -r{toxinidir}/requirements.txt'
+ grep -q text-docs tox.ini
+ echo 'The text-docs target does not exist for zaqar. Appending it...'
The text-docs target does not exist for zaqar. Appending it...
+ echo '

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  -r{toxinidir}/requirements.txt'
+ '[' zaqar '!=' neutron-lib ']'
+ tox -etext-docs
text-docs: install_deps> python -I -m pip install -r /tmp/os_docs_temp/zaqar/doc/requirements.txt -r /tmp/os_docs_temp/zaqar/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: install_requires> python -I -m pip install 'pbr>=6.1.1'
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: install_requires_for_build_editable> python -I -m pip install 'pbr>=2.0.0'
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
text-docs: install_package_deps> python -I -m pip install 'SQLAlchemy>=1.3.19' 'WebOb>=1.7.1' 'alembic>=0.9.6' 'autobahn>=22.3.2' 'cryptography>=2.7' 'falcon>=3.0.0' 'futurist>=1.2.0' 'jsonschema>=3.2.0' 'keystonemiddleware>=9.1.0' 'msgpack>=1.0.0' 'oslo.cache>=1.26.0' 'oslo.concurrency>=5.0.1' 'oslo.config>=8.3.2' 'oslo.context>=2.19.2' 'oslo.db>=11.0.0' 'oslo.i18n>=3.15.3' 'oslo.log>=4.6.1' 'oslo.messaging>=12.5.0' 'oslo.middleware>=3.31.0' 'oslo.policy>=4.5.0' 'oslo.reports>=2.2.0' 'oslo.serialization>=4.2.0' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=4.12.1' 'osprofiler>=1.4.0' 'pbr!=2.1.0,>=2.0.0' 'python-swiftclient>=3.10.1' 'requests>=2.25.0' 'stevedore>=3.2.2'
text-docs: install_package> python -I -m pip install --force-reinstall --no-deps /tmp/os_docs_temp/zaqar/.tox/.tmp/package/1/zaqar-0.0.0-0.editable-py3-none-any.whl
text-docs: commands[0]> sphinx-build --keep-going -j auto -b text doc/source doc/build/text
Running Sphinx v8.1.3
loading translations [en]... done
loading stevedore.sphinxext
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
making output directory... done
[openstackdocstheme] overriding configured project name (zaqar) with name extracted from the package (zaqar); you can disable this behavior with the 'openstackdocs_auto_name' option
Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`.
[oslo_config.sphinxconfiggen] reading config generator instructions from /tmp/os_docs_temp/zaqar/doc/source/../../etc/oslo-config-generator/zaqar.conf
[oslo_config.sphinxconfiggen] writing sample configuration to /tmp/os_docs_temp/zaqar/doc/source/_static/zaqar.conf.sample
[openstackdocstheme] using theme from /tmp/os_docs_temp/zaqar/.tox/text-docs/lib/python3.11/site-packages/openstackdocstheme/theme
building [mo]: targets for 0 po files that are out of date
writing output... 
building [text]: targets for 43 source files that are out of date
updating environment: [new config] 43 added, 0 changed, 0 removed
reading sources... [ 20%] admin/CORS .. configuration/configuring
reading sources... [ 40%] configuration/index .. contributor/jenkins
reading sources... [ 60%] contributor/launchpad .. index
reading sources... [ 80%] install/get_started .. user/headers_queue_api_working
loading config file etc/oslo-config-generator/zaqar.conf
reading sources... [100%] user/index .. user/send_request_api

looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
copying assets... 
copying assets: done
writing output... [ 25%] admin/OSprofiler .. configuration/sample-configuration
writing output... [ 50%] configuration/zaqar .. contributor/reviewer_guide
writing output... [ 75%] contributor/running_tests .. install/install-rdo
writing output... [100%] install/install-ubuntu .. user/send_request_api

build succeeded.

The text files are in doc/build/text.
.pkg: _exit> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
  text-docs: OK (28.89=setup[27.57]+cmd[1.32] seconds)
  congratulations :) (28.94 seconds)
+ '[' '' == venv ']'
+ local api_ref_failed=false
+ '[' true = true ']'
+ local api_dir=
+ '[' -d ./api-ref/source ']'
+ api_dir=api-ref
+ '[' -n api-ref ']'
+ echo 'Building API-Ref documentation for zaqar using api-ref...'
Building API-Ref documentation for zaqar using api-ref...
+ grep -q text-api-ref tox.ini
+ local adjusted_target
+ adjusted_target='
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ echo '
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ tox -etext-api-ref
text-api-ref: install_deps> python -I -m pip install os-api-ref -r /tmp/os_docs_temp/zaqar/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
text-api-ref: install_package_deps> python -I -m pip install 'SQLAlchemy>=1.3.19' 'WebOb>=1.7.1' 'alembic>=0.9.6' 'autobahn>=22.3.2' 'cryptography>=2.7' 'falcon>=3.0.0' 'futurist>=1.2.0' 'jsonschema>=3.2.0' 'keystonemiddleware>=9.1.0' 'msgpack>=1.0.0' 'oslo.cache>=1.26.0' 'oslo.concurrency>=5.0.1' 'oslo.config>=8.3.2' 'oslo.context>=2.19.2' 'oslo.db>=11.0.0' 'oslo.i18n>=3.15.3' 'oslo.log>=4.6.1' 'oslo.messaging>=12.5.0' 'oslo.middleware>=3.31.0' 'oslo.policy>=4.5.0' 'oslo.reports>=2.2.0' 'oslo.serialization>=4.2.0' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=4.12.1' 'osprofiler>=1.4.0' 'pbr!=2.1.0,>=2.0.0' 'python-swiftclient>=3.10.1' 'requests>=2.25.0' 'stevedore>=3.2.2'
text-api-ref: install_package> python -I -m pip install --force-reinstall --no-deps /tmp/os_docs_temp/zaqar/.tox/.tmp/package/2/zaqar-0.0.0-0.editable-py3-none-any.whl
text-api-ref: commands[0]> sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
making output directory... done
[openstackdocstheme] overriding configured project name (Project name not set) with name extracted from the package (zaqar); you can disable this behavior with the 'openstackdocs_auto_name' option
Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`.
[openstackdocstheme] using theme from /tmp/os_docs_temp/zaqar/.tox/text-api-ref/lib/python3.11/site-packages/openstackdocstheme/theme
building [mo]: targets for 0 po files that are out of date
writing output... 
building [html]: targets for 1 source files that are out of date
updating environment: [new config] 1 added, 0 changed, 0 removed
reading sources... [100%] index

looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
copying assets... 
copying static files... 
Writing evaluated template result to /tmp/os_docs_temp/zaqar/api-ref/build/html/_static/basic.css
Writing evaluated template result to /tmp/os_docs_temp/zaqar/api-ref/build/html/_static/documentation_options.js
Writing evaluated template result to /tmp/os_docs_temp/zaqar/api-ref/build/html/_static/language_data.js
copying static files: done
copying extra files... 
copying extra files: done
copying assets: done

generating indices... genindex done
writing additional pages... search done
dumping search index in English (code: en)... done
dumping object inventory... done
Copying assets: api-site.css, api-site.js
Copying fonts: glyphicons-halflings-regular.ttf, glyphicons-halflings-regular.woff
build succeeded.

The HTML pages are in api-ref/build/html.
.pkg: _exit> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
  text-api-ref: OK (26.88=setup[26.21]+cmd[0.67] seconds)
  congratulations :) (26.92 seconds)
+ '[' false '!=' true ']'
+ echo 'Converting API-Ref HTML to plain text for zaqar...'
Converting API-Ref HTML to plain text for zaqar...
+ rm -rf ./api-ref/build/text
+ mkdir -p ./api-ref/build/text
+ converted_count=0
+ IFS=
+ read -r -d '' html_file
++ find ./api-ref/build/html -name '*.html' -type f -print0
+ rel_path=index.html
+ text_file=./api-ref/build/text/index.txt
++ dirname ./api-ref/build/text/index.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/index.html -o ./api-ref/build/text/index.txt
+ converted_count=1
+ IFS=
+ read -r -d '' html_file
+ rel_path=genindex.html
+ text_file=./api-ref/build/text/genindex.txt
++ dirname ./api-ref/build/text/genindex.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/genindex.html -o ./api-ref/build/text/genindex.txt
[WARNING] Duplicate identifier 'index' at input line 197 column 21
+ converted_count=2
+ IFS=
+ read -r -d '' html_file
+ rel_path=search.html
+ text_file=./api-ref/build/text/search.txt
++ dirname ./api-ref/build/text/search.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/search.html -o ./api-ref/build/text/search.txt
+ converted_count=3
+ IFS=
+ read -r -d '' html_file
+ echo 'Converted 3 HTML files to text for zaqar'
Converted 3 HTML files to text for zaqar
+ find ./api-ref/build/text -type f -exec grep -l logo-full.svg '{}' +
+ xargs rm -f
+ true
+ find ./api-ref/build/text '(' -name genindex.txt -o -name search.txt ')' -delete
+ rm -rf ./api-ref/build/text/_sources
++ find ./api-ref/build/text -name '*.txt' -type f -size +1k
++ wc -l
+ api_file_count=1
+ '[' 1 -gt 0 ']'
+ echo 'API-Ref: Found 1 content files for zaqar'
API-Ref: Found 1 content files for zaqar
+ find ./api-ref/build/text -mindepth 1 -depth -type d -empty -delete
+ '[' '' == venv ']'
+ '[' zaqar == adjutant ']'
+ '[' zaqar == cyborg ']'
+ '[' zaqar == tempest ']'
+ '[' zaqar == venus ']'
+ _output_version=2025.2
+ local project_output_dir=/tmp/os_docs_temp/openstack-docs-plaintext/zaqar
+ rm -rf /tmp/os_docs_temp/openstack-docs-plaintext/zaqar
+ mkdir -p /tmp/os_docs_temp/openstack-docs-plaintext/zaqar
+ '[' -d doc/build/text ']'
+ cp -r doc/build/text /tmp/os_docs_temp/openstack-docs-plaintext/zaqar/2025.2_docs
+ '[' true = true ']'
+ '[' false '!=' true ']'
+ '[' -n api-ref ']'
+ '[' -d api-ref/build/text ']'
+ cp -r api-ref/build/text /tmp/os_docs_temp/openstack-docs-plaintext/zaqar/2025.2_api-ref
+ echo 'API-Ref documentation copied for zaqar'
API-Ref documentation copied for zaqar
+ cd -
/tmp/os_docs_temp
+ '[' '' == all ']'
+ rm -rf '/tmp/os_docs_temp/openstack-docs-plaintext/zaqar/2025.2*/_static/' /tmp/os_docs_temp/openstack-docs-plaintext/zaqar/2025.2_docs/.doctrees/

+ echo
+ for log_file in "${LOG_FILES[@]}"
-- /tmp/zun_r5S6i.log ---------------------------------------
+ echo '-- /tmp/zun_r5S6i.log ---------------------------------------'
+ cat /tmp/zun_r5S6i.log
+ local project=zun
+ local _os_version=2025.2
+ local 'tox_text_docs_target=

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
'
+ local 'tox_text_api_ref_target=
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ echo 'Generating the plain-text documentation for OpenStack zun'
Generating the plain-text documentation for OpenStack zun
+ echo 'OS_API_DOCS is set to: true'
OS_API_DOCS is set to: true
+ local branch_prefix=
+ '[' 2025.2 '!=' master ']'
+ branch_prefix=stable/
+ '[' '!' -d zun ']'
+ git clone -v --depth=1 --single-branch -b stable/2025.2 https://opendev.org/openstack/zun.git
Cloning into 'zun'...
POST git-upload-pack (406 bytes)
POST git-upload-pack (194 bytes)
+ cd zun
+ '[' zun == designate ']'
+ '[' zun == ironic ']'
+ '[' zun == heat ']'
+ [[ zun == \t\r\o\v\e ]]
+ [[ zun == \z\a\q\a\r ]]
+ grep -q text-docs tox.ini
+ echo 'The text-docs target does not exist for zun. Appending it...'
The text-docs target does not exist for zun. Appending it...
+ echo '

[testenv:text-docs]
description =
    Build documentation in text format.
basepython = python3.11
commands =
  sphinx-build --keep-going -j auto -b text doc/source doc/build/text
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
'
+ '[' zun '!=' neutron-lib ']'
+ tox -etext-docs
text-docs: install_deps> pip install -r /tmp/os_docs_temp/zun/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: install_requires> python -I -m pip install 'setuptools>=40.8.0'
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: get_requires_for_build_sdist> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: install_requires_for_build_sdist> python -I -m pip install 'pbr>=2.0.0'
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: install_requires_for_build_editable> python -I -m pip install 'pbr>=2.0.0'
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
text-docs: install_package_deps> pip install 'Flask>=0.12.3' 'PyYAML>=5.1' 'SQLAlchemy>=1.2.0' 'WebOb>=1.8.1' 'alembic>=0.9.8' 'cotyledon>=1.5.0' 'docker>=4.3.0' 'eventlet>=0.28.0' 'futurist>=1.6.0' 'grpcio>=1.25.0' 'keystoneauth1>=3.14.0' 'keystonemiddleware>=9.0.0' 'kuryr-lib>=0.5.0' 'neutron-lib>=1.13.0' 'os-brick>=3.1.0' 'os-resource-classes>=0.1.0' 'os-traits>=0.15.0' 'os-vif>=1.15.1' 'oslo.concurrency>=4.1.0' 'oslo.config>=8.1.0' 'oslo.context>=3.1.0' 'oslo.db>=8.2.0' 'oslo.i18n>=5.0.0' 'oslo.log>=4.2.0' 'oslo.messaging>=14.1.0' 'oslo.middleware>=4.1.0' 'oslo.policy>=4.5.0' 'oslo.privsep>=2.2.0' 'oslo.rootwrap>=5.8.0' 'oslo.serialization>=3.2.0' 'oslo.service>=2.2.0' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=4.5.0' 'oslo.versionedobjects>=2.1.0' 'pbr>=5.5.0' 'pecan>=1.3.3' 'protobuf>=3.6.0' 'psutil>=3.2.2' 'pyroute2>=0.5.7' 'python-cinderclient>=7.1.0' 'python-glanceclient>=3.2.0' 'python-neutronclient>=7.2.0' 'requests>=2.20.1' 'retrying>=1.3.3' 'stevedore>=3.3.0' 'tenacity>=6.0.0' 'websocket-client>=0.44.0' 'websockify>=0.8.0'
text-docs: install_package> pip install --force-reinstall --no-deps /tmp/os_docs_temp/zun/.tox/.tmp/package/1/zun-0.0.0-0.editable-py3-none-any.whl
text-docs: commands[0]> sphinx-build --keep-going -j auto -b text doc/source doc/build/text
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
making output directory... done
[openstackdocstheme] overriding configured project name (zun) with name extracted from the package (zun); you can disable this behavior with the 'openstackdocs_auto_name' option
Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`.
[openstackdocstheme] using theme from /tmp/os_docs_temp/zun/.tox/text-docs/lib/python3.11/site-packages/openstackdocstheme/theme
[oslo_config.sphinxconfiggen] reading config generator instructions from /tmp/os_docs_temp/zun/doc/source/../../etc/zun/zun-config-generator.conf
[oslo_config.sphinxconfiggen] writing sample configuration to /tmp/os_docs_temp/zun/doc/source/_static/zun.conf.sample
/tmp/os_docs_temp/zun/.tox/text-docs/lib/python3.11/site-packages/webob/compat.py:5: DeprecationWarning: 'cgi' is deprecated and slated for removal in Python 3.13
  from cgi import parse_header
/tmp/os_docs_temp/zun/.tox/text-docs/lib/python3.11/site-packages/oslo_concurrency/lockutils.py:41: DeprecationWarning: 
Eventlet is deprecated. It is currently being maintained in bugfix mode, and
we strongly recommend against using it for new projects.

If you are already using Eventlet, we recommend migrating to a different
framework.  For more detail see
https://eventlet.readthedocs.io/en/latest/asyncio/migration.html

  import eventlet
/tmp/os_docs_temp/zun/.tox/text-docs/lib/python3.11/site-packages/oslo_utils/eventletutils.py:36: DeprecationWarning: eventletutils module is deprecated and will be removed.
  debtcollector.deprecate(
/tmp/os_docs_temp/zun/.tox/text-docs/lib/python3.11/site-packages/oslo_service/eventlet_backdoor.py:36: DeprecationWarning: The 'oslo_service.eventlet_backdoor' module usage is deprecated and will be removed in version '2026.2': The 'eventlet_backdoor' module is deprecated and will be removed in version 2026.2. This module is not being replaced. Please migrate away from using it and remove any dependencies on this module.
  removals.removed_module(
/tmp/os_docs_temp/zun/.tox/text-docs/lib/python3.11/site-packages/oslo_service/sslutils.py:24: DeprecationWarning: The 'oslo_service.sslutils' module usage is deprecated and will be removed in version '2026.2': The 'oslo_service.sslutils' module is deprecated and will be removed in version 2026.2.
  removals.removed_module(
[oslo_policy.sphinxpolicygen] reading config generator instructions from /tmp/os_docs_temp/zun/doc/source/../../etc/zun/zun-policy-generator.conf
[oslo_policy.sphinxpolicygen] writing sample policy to /tmp/os_docs_temp/zun/doc/source/_static/zun.policy.yaml.sample
building [mo]: targets for 0 po files that are out of date
writing output... 
building [text]: targets for 44 source files that are out of date
updating environment: [new config] 44 added, 0 changed, 0 removed
/tmp/os_docs_temp/zun/.tox/text-docs/lib/python3.11/site-packages/eventlet/__init__.py:83: DeprecationWarning: Using fork() is a bad idea, and there is no guarantee eventlet will work. See https://eventlet.readthedocs.io/en/latest/fork.html for more details.
  warnings.warn(
reading sources... [ 20%] admin/README .. cli/zun-status
reading sources... [ 40%] configuration/README .. contributor/gerrit
reading sources... [ 60%] contributor/index .. contributor/unit-tests
reading sources... [ 80%] contributor/vision-reflection .. install/overview
reading sources... [100%] install/verify .. user/filter-scheduler

looking for now-outdated files... none found
pickling environment... done
checking consistency... /tmp/os_docs_temp/zun/doc/source/contributor/quickstart.rst: document is referenced in multiple toctrees: ['contributor/index', 'index'], selecting: index <- contributor/quickstart
done
preparing documents... done
copying assets... 
copying assets: done
writing output... [ 25%] admin/clear-containers .. configuration/index
writing output... [ 50%] configuration/policy .. contributor/launchpad
writing output... [ 75%] contributor/mod-wsgi .. install/compute-install
writing output... [100%] install/controller-install .. user/filter-scheduler

build succeeded.

The text files are in doc/build/text.
  text-docs: OK (39.60=setup[38.64]+cmd[0.96] seconds)
  congratulations :) (39.65 seconds)
+ '[' '' == venv ']'
+ local api_ref_failed=false
+ '[' true = true ']'
+ local api_dir=
+ '[' -d ./api-ref/source ']'
+ api_dir=api-ref
+ '[' -n api-ref ']'
+ echo 'Building API-Ref documentation for zun using api-ref...'
Building API-Ref documentation for zun using api-ref...
+ grep -q text-api-ref tox.ini
+ local adjusted_target
+ adjusted_target='
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ echo '
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
'
+ tox -etext-api-ref
text-api-ref: install_deps> pip install os-api-ref -r /tmp/os_docs_temp/zun/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: get_requires_for_build_sdist> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__
text-api-ref: install_package_deps> pip install 'Flask>=0.12.3' 'PyYAML>=5.1' 'SQLAlchemy>=1.2.0' 'WebOb>=1.8.1' 'alembic>=0.9.8' 'cotyledon>=1.5.0' 'docker>=4.3.0' 'eventlet>=0.28.0' 'futurist>=1.6.0' 'grpcio>=1.25.0' 'keystoneauth1>=3.14.0' 'keystonemiddleware>=9.0.0' 'kuryr-lib>=0.5.0' 'neutron-lib>=1.13.0' 'os-brick>=3.1.0' 'os-resource-classes>=0.1.0' 'os-traits>=0.15.0' 'os-vif>=1.15.1' 'oslo.concurrency>=4.1.0' 'oslo.config>=8.1.0' 'oslo.context>=3.1.0' 'oslo.db>=8.2.0' 'oslo.i18n>=5.0.0' 'oslo.log>=4.2.0' 'oslo.messaging>=14.1.0' 'oslo.middleware>=4.1.0' 'oslo.policy>=4.5.0' 'oslo.privsep>=2.2.0' 'oslo.rootwrap>=5.8.0' 'oslo.serialization>=3.2.0' 'oslo.service>=2.2.0' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=4.5.0' 'oslo.versionedobjects>=2.1.0' 'pbr>=5.5.0' 'pecan>=1.3.3' 'protobuf>=3.6.0' 'psutil>=3.2.2' 'pyroute2>=0.5.7' 'python-cinderclient>=7.1.0' 'python-glanceclient>=3.2.0' 'python-neutronclient>=7.2.0' 'requests>=2.20.1' 'retrying>=1.3.3' 'stevedore>=3.3.0' 'tenacity>=6.0.0' 'websocket-client>=0.44.0' 'websockify>=0.8.0'
text-api-ref: install_package> pip install --force-reinstall --no-deps /tmp/os_docs_temp/zun/.tox/.tmp/package/2/zun-0.0.0-0.editable-py3-none-any.whl
text-api-ref: commands[0]> sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler
making output directory... done
Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`.
[openstackdocstheme] using theme from /tmp/os_docs_temp/zun/.tox/text-api-ref/lib/python3.11/site-packages/openstackdocstheme/theme
building [mo]: targets for 0 po files that are out of date
writing output... 
building [html]: targets for 1 source files that are out of date
updating environment: [new config] 1 added, 0 changed, 0 removed
reading sources... [100%] index

looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
copying assets... 
copying static files... 
Writing evaluated template result to /tmp/os_docs_temp/zun/api-ref/build/html/_static/basic.css
Writing evaluated template result to /tmp/os_docs_temp/zun/api-ref/build/html/_static/documentation_options.js
Writing evaluated template result to /tmp/os_docs_temp/zun/api-ref/build/html/_static/language_data.js
copying static files: done
copying extra files... 
copying extra files: done
copying assets: done

generating indices... genindex done
writing additional pages... search done
dumping search index in English (code: en)... done
dumping object inventory... done
Copying assets: api-site.css, api-site.js
Copying fonts: glyphicons-halflings-regular.ttf, glyphicons-halflings-regular.woff
build succeeded.

The HTML pages are in api-ref/build/html.
  text-api-ref: OK (38.65=setup[37.66]+cmd[0.99] seconds)
  congratulations :) (38.70 seconds)
+ '[' false '!=' true ']'
+ echo 'Converting API-Ref HTML to plain text for zun...'
Converting API-Ref HTML to plain text for zun...
+ rm -rf ./api-ref/build/text
+ mkdir -p ./api-ref/build/text
+ converted_count=0
+ IFS=
+ read -r -d '' html_file
++ find ./api-ref/build/html -name '*.html' -type f -print0
+ rel_path=index.html
+ text_file=./api-ref/build/text/index.txt
++ dirname ./api-ref/build/text/index.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/index.html -o ./api-ref/build/text/index.txt
+ converted_count=1
+ IFS=
+ read -r -d '' html_file
+ rel_path=genindex.html
+ text_file=./api-ref/build/text/genindex.txt
++ dirname ./api-ref/build/text/genindex.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/genindex.html -o ./api-ref/build/text/genindex.txt
[WARNING] Duplicate identifier 'index' at input line 197 column 21
+ converted_count=2
+ IFS=
+ read -r -d '' html_file
+ rel_path=search.html
+ text_file=./api-ref/build/text/search.txt
++ dirname ./api-ref/build/text/search.txt
+ mkdir -p ./api-ref/build/text
+ pandoc -f html -t plain --wrap=preserve ./api-ref/build/html/search.html -o ./api-ref/build/text/search.txt
+ converted_count=3
+ IFS=
+ read -r -d '' html_file
+ echo 'Converted 3 HTML files to text for zun'
Converted 3 HTML files to text for zun
+ find ./api-ref/build/text -type f -exec grep -l logo-full.svg '{}' +
+ xargs rm -f
+ true
+ find ./api-ref/build/text '(' -name genindex.txt -o -name search.txt ')' -delete
+ rm -rf ./api-ref/build/text/_sources
++ find ./api-ref/build/text -name '*.txt' -type f -size +1k
++ wc -l
+ api_file_count=1
+ '[' 1 -gt 0 ']'
+ echo 'API-Ref: Found 1 content files for zun'
API-Ref: Found 1 content files for zun
+ find ./api-ref/build/text -mindepth 1 -depth -type d -empty -delete
+ '[' '' == venv ']'
+ '[' zun == adjutant ']'
+ '[' zun == cyborg ']'
+ '[' zun == tempest ']'
+ '[' zun == venus ']'
+ _output_version=2025.2
+ local project_output_dir=/tmp/os_docs_temp/openstack-docs-plaintext/zun
+ rm -rf /tmp/os_docs_temp/openstack-docs-plaintext/zun
+ mkdir -p /tmp/os_docs_temp/openstack-docs-plaintext/zun
+ '[' -d doc/build/text ']'
+ cp -r doc/build/text /tmp/os_docs_temp/openstack-docs-plaintext/zun/2025.2_docs
+ '[' true = true ']'
+ '[' false '!=' true ']'
+ '[' -n api-ref ']'
+ '[' -d api-ref/build/text ']'
+ cp -r api-ref/build/text /tmp/os_docs_temp/openstack-docs-plaintext/zun/2025.2_api-ref
+ echo 'API-Ref documentation copied for zun'
API-Ref documentation copied for zun
+ cd -
/tmp/os_docs_temp
+ '[' '' == all ']'
+ rm -rf '/tmp/os_docs_temp/openstack-docs-plaintext/zun/2025.2*/_static/' /tmp/os_docs_temp/openstack-docs-plaintext/zun/2025.2_docs/.doctrees/
+ echo
+ pushd /tmp/os_docs_temp/openstack-docs-plaintext
+ for path in "${PRUNE_PATHS[@]}"

/tmp/os_docs_temp/openstack-docs-plaintext /tmp/os_docs_temp
+ rm -f -- glance/2024.2_docs/contributor/api/glance.common.format_inspector.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- neutron/2024.2_docs/contributor/internals/linuxbridge_agent.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- neutron/2024.2_docs/contributor/testing/ci_scenario_jobs.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- python-openstackclient/2024.2_docs/contributor/api/openstackclient.volume.v1.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- python-openstackclient/2024.2_docs/contributor/specs/command-objects/example.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- python-openstackclient/2024.2_docs/contributor/specs/commands.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- python-openstackclient/2024.2_docs/contributor/specs/network-topology.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.limits.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.snapshots.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.views.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.volume_metadata.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.volumes.txt
+ for path in "${PRUNE_PATHS[@]}"
+ rm -f -- cinder/2025.2_docs/contributor/api/cinder.api.v2.views.volumes.txt
/tmp/os_docs_temp
+ popd
+ rm -rf '/rag-content/openstack-docs-plaintext/*/2025.2'
+ cp -r /tmp/os_docs_temp/openstack-docs-plaintext /rag-content/openstack-docs-plaintext
+ echo 'Done. Documents can be found at /rag-content/openstack-docs-plaintext'
Done. Documents can be found at /rag-content/openstack-docs-plaintext
COMMIT localhost/local-api-proof-pandoc:latest
--> b3eaef1fdc35
Successfully tagged localhost/local-api-proof-pandoc:latest
b3eaef1fdc35f99ece66ad057877ff7d03cc63d59aa0edd4fb171f455daa38a8
ojoshi@ojoshi-mac rag-content % 

Copy link
Copy Markdown
Contributor

@lpiwowar lpiwowar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍 Thanks for the PR and for the proof of testing comments!:) 🎉

Notes

  • I think this is safe to merge since the PR does not influence the rest of the upstream documentation generation.

API-ref docs observations

  1. (non-blocking) They contain symbols.
  2. (non-blocking) They are missing any sense of hierarchy. There is no indication for headers and so on. I'm wondering why we do not convert to rst or md:
pandoc -f html -t plain --wrap=preserve "$html_file" -o "$text_file" || {
                        echo "ERROR: Failed to convert $html_file"
                        return 1
                    }
  1. (non-blocking) It would be nice if they were converted to a similar style as the rest of the upstream documentation, but I guess we do not have to deal with that now. It is disabled by default, and we can polish this with the rest of the upstream documentation later - converting everything to nice Markdown (this would allow us to chunk the API ref documentation more nicely later).
  2. (non-blocking) These things ideally should be at least documented in Issues in this repo after merging.

Issue With Api Ref docs

  • I ran the building of the image with the API docs locally, and it is failing for me on the following error (on main as well -> not caused by this PR). It might be related to the error we are seeing in the CI for the upstream docs though. Somebody should take a look on this.
$ make build-image-os BUILD_OCP_DOCS=true FLAVOR=gpu BUILD_GPU_ARGS="--device nvidia.com/gpu=all" OS_API_DOCS=true OS_PROJECTS="keystone"
...
+ tox -etext-api-ref
text-api-ref: install_deps> python -I -m pip install os-api-ref -r /tmp/os_docs_temp/keystone/doc/requirements.txt -c https://releases.openstack.org/constraints/upper/2025.2
.pkg: _optional_hooks> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: get_requires_for_build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
.pkg: build_editable> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
text-api-ref: install_package_deps> python -I -m pip install 'Flask!=0.11,>=1.0.2' 'Flask-RESTful>=0.3.5' 'PyJWT>=1.6.1' 'SQLAlchemy>=1.4.0' 'WebOb>=1.7.1' 'Werkzeug>=0.15.0' 'bcrypt>=3.1.3' 'cryptography>=2.7' 'dogpile.cache>=1.0.2' 'jsonschema>=3.2.0' 'keystonemiddleware>=7.0.0' 'msgpack>=0.5.0' 'oauthlib>=0.6.2' 'oslo.cache>=1.26.0' 'oslo.config>=6.8.0' 'oslo.context>=2.22.0' 'oslo.db>=6.0.0' 'oslo.i18n>=3.15.3' 'oslo.log>=3.44.0' 'oslo.messaging>=5.29.0' 'oslo.middleware>=3.31.0' 'oslo.policy>=4.5.0' 'oslo.serialization!=2.19.1,>=2.18.0' 'oslo.upgradecheck>=1.3.0' 'oslo.utils>=3.33.0' 'osprofiler>=1.4.0' 'pbr!=2.1.0,>=2.0.0' 'pycadf!=2.0.0,>=1.1.0' 'pysaml2>=5.0.0' 'python-keystoneclient>=3.8.0' 'scrypt>=0.8.0' 'stevedore>=1.20.0'
text-api-ref: install_package> python -I -m pip install --force-reinstall --no-deps /tmp/os_docs_temp/keystone/.tox/.tmp/package/2/keystone-0.0.0-0.editable-py3-none-any.whl
text-api-ref: commands[0]> sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
Running Sphinx v8.1.3
loading translations [en]... done
[openstackdocstheme] version: 3.5.0
[openstackdocstheme] connecting html-page-context event handler

Extension error:
Could not import extension os_openapi (exception: No module named 'os_openapi')
text-api-ref: exit 2 (0.57 seconds) /tmp/os_docs_temp/keystone> sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html pid=1709
.pkg: _exit> python /opt/app-root/lib64/python3.11/site-packages/pyproject_api/_backend.py True pbr.build
  text-api-ref: FAIL code 2 (29.07=setup[28.50]+cmd[0.57] seconds)
  evaluation failed :( (29.19 seconds)
+ echo 'WARNING: API-Ref build failed for keystone'
WARNING: API-Ref build failed for keystone
+ exit 1

@openshift-ci
Copy link
Copy Markdown

openshift-ci Bot commented Mar 3, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: lpiwowar, omkarjoshi0304

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved label Mar 3, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 23, 2026

📝 Walkthrough

Walkthrough

Container build and docs pipeline updated: Pandoc 3.1.11.1 is installed in the upstream docs stage, html2text was removed from Python deps, API-Ref URL mapping was added in the OpenStack docs processor, and the API-Ref detection, conversion (now via pandoc), cleanup, and copy logic in the build script were reworked.

Changes

Cohort / File(s) Summary
Container & Dependencies
Containerfile, requirements.txt
Install pinned Pandoc 3.1.11.1 into /usr/local/ during upstream docs stage; remove html2text from pip installs and requirements.txt, leaving tox as the remaining pip dependency.
URL Routing for API-Ref
scripts/generate_embeddings_openstack.py
Add API_REF_SERVICE_MAPPING: dict[str,str] and refactor OpenStackDocsMetadataProcessor.url_function to route API-Ref paths to {base_url}/api-ref/{service_name}/{remaining_path} using the mapping; preserve non-API-Ref URL rewriting behavior.
API-Ref Build & Conversion Pipeline
scripts/get_openstack_plaintext_docs.sh
Detect api-ref or api-guide source dirs dynamically; run tox -etext-api-ref and exit on failure; convert HTML → plain text using pandoc (from ./$api_dir/build/html./$api_dir/build/text); simplify cleanup and adjust copy/cleanup target paths and .tox cleanup entry.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested labels

lgtm

Suggested reviewers

  • lpiwowar
  • umago
  • Akrog

Poem

🐰 Bundled Pandoc, light and spry,

swapping tools that once ran by.
Project names now find their place,
API-Ref paths fall into place.
Hops of joy for docs that fly!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title accurately summarizes the main change: improving API-ref extraction quality and coverage in the RAG pipeline by implementing pandoc-based extraction, better filtering, and auto-detection logic.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
scripts/generate_embeddings_openstack.py (1)

65-71: ⚠️ Potential issue | 🟡 Minor

Keep the fallback path as a Path.

If relative_to() fails, Line 69 stores path_obj.name as a str, but Line 71 unconditionally calls .as_posix(). That turns the fallback branch into an AttributeError.

Proposed fix
         try:
             relative_path = path_obj.relative_to(self.folder_path.resolve())
         except ValueError:
-            relative_path = path_obj.name
+            relative_path = Path(path_obj.name)

         relative_path_str = relative_path.as_posix()
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate_embeddings_openstack.py` around lines 65 - 71, The fallback
in the except block currently sets relative_path to a str (path_obj.name) but
later calls relative_path.as_posix(), causing AttributeError; change the except
branch to assign a Path object (e.g., relative_path = Path(path_obj.name) or
Path(path_obj.name).resolve()) so relative_path is always a pathlib.Path and
relative_path_str = relative_path.as_posix() works; update references around
path_obj.relative_to(self.folder_path.resolve()), relative_path, and
relative_path_str accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Containerfile`:
- Around line 24-27: The RUN block gated by BUILD_UPSTREAM_DOCS installs pandoc
using a non-existent release (pandoc-3.1.11.1) and uses curl without checksum
verification; replace the inlined curl -L download in that RUN step with a
sequence that references a real released pandoc version (e.g., 3.1.8 or newer),
use curl -fsSL to download the tarball to a temporary file, fetch the
corresponding published SHA256 checksum for that exact release, verify the
downloaded archive's checksum before extraction, then extract
(--strip-components=1) and remove the archive; update the filename referenced in
the RUN command and any hardcoded pandoc-* identifier to match the chosen
released version.

In `@scripts/generate_embeddings_openstack.py`:
- Around line 77-93: The code silently falls back to the repository name when
building API-Ref URLs using API_REF_SERVICE_MAPPING.get(project_name,
project_name); change this to require an explicit mapping: look up project_name
in API_REF_SERVICE_MAPPING (use API_REF_SERVICE_MAPPING[project_name] or check
'if project_name not in API_REF_SERVICE_MAPPING'), and if missing either raise
an exception (e.g., ValueError) or log an error and fail fast so you don't emit
incorrect /api-ref/{project}/... URLs; also add any missing mappings (e.g.,
include 'zun' -> the correct service slug) to API_REF_SERVICE_MAPPING to cover
supported API-ref projects.

In `@scripts/get_openstack_plaintext_docs.sh`:
- Around line 247-251: The script currently validates startup dependencies (tox
and PYTHON) but misses pandoc, which is required when OS_API_DOCS=true before
the HTML->plain conversion in the pandoc call (used in the block referencing
"$html_file" -> "$text_file"); add an early fast-fail check so when
OS_API_DOCS=true the script runs a command existence check (e.g. command -v
pandoc) and prints a clear error and exits non-zero if pandoc is not found,
matching the style used for the existing dependency checks.
- Around line 224-231: The substitution of tox_text_api_ref_target using
"${tox_text_api_ref_target//api-ref/$api_dir}" wrongly rewrites environment
names and other tokens; change the logic so you only rewrite path segments
inside tox_text_api_ref_target (e.g., replace occurrences of "api-ref/" or
"/api-ref" or the specific build/source path components) or compute an
adjusted_env variable (keep "text-api-ref" if the env exists, otherwise set
adjusted_env="text-${api_dir##*/}" or similar) and use that adjusted_env in the
tox invocation (replace the hardcoded "tox -etext-api-ref" with "tox
-e${adjusted_env}"); also add a pre-check that pandoc is installed before its
invocation (e.g., command -v pandoc || { echo ...; exit 1; }) to avoid running
pandoc without verification.

---

Outside diff comments:
In `@scripts/generate_embeddings_openstack.py`:
- Around line 65-71: The fallback in the except block currently sets
relative_path to a str (path_obj.name) but later calls relative_path.as_posix(),
causing AttributeError; change the except branch to assign a Path object (e.g.,
relative_path = Path(path_obj.name) or Path(path_obj.name).resolve()) so
relative_path is always a pathlib.Path and relative_path_str =
relative_path.as_posix() works; update references around
path_obj.relative_to(self.folder_path.resolve()), relative_path, and
relative_path_str accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ec1defaf-30cc-40f0-83fc-ddc67b202f3c

📥 Commits

Reviewing files that changed from the base of the PR and between c275299 and a3c8532.

📒 Files selected for processing (4)
  • Containerfile
  • requirements.txt
  • scripts/generate_embeddings_openstack.py
  • scripts/get_openstack_plaintext_docs.sh
💤 Files with no reviewable changes (1)
  • requirements.txt

Comment thread Containerfile
Comment on lines 24 to +27
RUN if [ "$BUILD_UPSTREAM_DOCS" = "true" ]; then \
dnf install -y graphviz python-devel pcre-devel pip && \
pip install tox html2text && \
bash -c 'curl -L https://github.com/jgm/pandoc/releases/download/3.1.11.1/pandoc-3.1.11.1-linux-amd64.tar.gz | tar -zx --strip-components=1 -C /usr/local/' && \
pip install tox && \
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

cat Containerfile | head -50

Repository: openstack-lightspeed/rag-content

Length of output: 1625


🏁 Script executed:

# Search for Pandoc-related lines in the Containerfile
rg -n "pandoc" Containerfile -i -A 3 -B 3

Repository: openstack-lightspeed/rag-content

Length of output: 538


🏁 Script executed:

cat -n Containerfile

Repository: openstack-lightspeed/rag-content

Length of output: 8242


🌐 Web query:

Pandoc 3.1.11.1 release checksum signature verification GitHub

💡 Result:

No official Pandoc 3.1.11.1 release exists on GitHub at https://github.com/jgm/pandoc/releases. The latest releases are 3.9.0.2 (2026-03-19), with earlier ones like 3.1.8 (2023-09-09) and 3.1.2 (2023-03-28). Pandoc 3.1.11.1 appears to be a Debian/Ubuntu package version (haskell-pandoc 3.1.11.1+ds-2 in Debian testing/unstable), not an upstream release, so it lacks official GitHub binaries, checksums, or PGP signatures from jgm/pandoc. Pandoc releases on GitHub provide SHA256 checksums next to each binary asset (e.g., for 3.9.0.2-linux-amd64.tar.gz: a69abfababda8a56969a254b09f9553a7be89ddec00d4e0fe9fd585d71a67508). No PGP signatures are provided; verification relies on GitHub's hosting and SHA256 checksums. macOS .pkg files are Apple-signed and notarized. An announcement discussion exists at jgm/pandoc#9307, but no assets/checksums there for 3.1.11.1. For Debian packages, use apt cryptographic verification or compute local checksums against published Debian values if available.

Citations:


🌐 Web query:

curl -L vs curl -fsSL HTTP error handling differences

💡 Result:

The key difference in HTTP error handling between curl -L and curl -fsSL lies in how they respond to HTTP errors (response codes >=400): - curl -L (follow redirects only): Does not treat HTTP errors as failures. It outputs the error page body to stdout, shows progress meter and any errors, and exits with code 0 (success). Scripts checking $? will not detect the error. - curl -fsSL (-f: fail on errors, -s: silent/no progress, -S: show-error, -L: follow redirects): Treats HTTP >=400 responses (after following redirects) as failures. Exits with code 22, suppresses the error body output (no data to stdout), hides progress but shows error message to stderr. Ideal for scripts to detect failures reliably. Both follow redirects (-L). Without -f, curl considers only connection issues as errors, not HTTP status codes. With -f, it checks the final response after redirects. Examples: curl -L https://httpstat.us/500 # Outputs error HTML, exit 0 curl -fsSL https://httpstat.us/500 # No output, "curl: (22) ... 500", exit 22 Note: -f may not catch 401/407 auth errors. Use --fail-with-body (curl >=7.76.0) to also output body on failure.

Citations:


Use an actual released version of Pandoc and add checksum verification.

Pandoc 3.1.11.1 does not exist as an official GitHub release—it's a Debian/Ubuntu package version only. The download URL will fail with a 404 error. Use a released version from the Pandoc releases page (e.g., 3.1.8 or later). Additionally, switch from curl -L to curl -fsSL to fail fast on HTTP errors, download the archive explicitly, verify the published SHA256 checksum before extraction, and then extract it.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Containerfile` around lines 24 - 27, The RUN block gated by
BUILD_UPSTREAM_DOCS installs pandoc using a non-existent release
(pandoc-3.1.11.1) and uses curl without checksum verification; replace the
inlined curl -L download in that RUN step with a sequence that references a real
released pandoc version (e.g., 3.1.8 or newer), use curl -fsSL to download the
tarball to a temporary file, fetch the corresponding published SHA256 checksum
for that exact release, verify the downloaded archive's checksum before
extraction, then extract (--strip-components=1) and remove the archive; update
the filename referenced in the RUN command and any hardcoded pandoc-* identifier
to match the chosen released version.

Comment on lines +77 to +93
# Check if this is API-Ref documentation
if "_api-ref/" in relative_path_str:
# This is API-Ref documentation - use different URL pattern
# Pattern: project/version_api-ref/... -> /api-ref/service/...

# Get the service name from mapping
service_name = self.API_REF_SERVICE_MAPPING.get(project_name, project_name)

# Remove _api-ref suffix: /cinder/2025.2_api-ref/ → /cinder/2025.2/api-ref/
relative_path = re.sub(r"/(\d+\.\d+)_api-ref/", r"/\1/api-ref/", relative_path)
# Remove project name and version_api-ref prefix
# Example: heat/2025.2_api-ref/v1/index.txt -> v1/index.txt
api_ref_pattern = re.compile(r"^[^/]+/(?:\d+\.\d+|latest)_api-ref/")
remaining_path = api_ref_pattern.sub("", relative_path_str)

# Replace .txt with .html
remaining_path = remaining_path.replace(".txt", ".html")
# Build API-Ref URL
return f"{self.base_url}/api-ref/{service_name}/{remaining_path}"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Don’t silently fall back to the repository name for API-Ref services.

service_name = self.API_REF_SERVICE_MAPPING.get(project_name, project_name) means any newly ingested _api-ref project that is missing from this table will still emit /api-ref/{project}/... URLs with no signal that the mapping is incomplete. The PR notes already mention Zun API-ref output, but zun is not covered here. Please either complete the mapping for supported API-ref projects or fail fast when an API-ref project has no explicit service slug.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate_embeddings_openstack.py` around lines 77 - 93, The code
silently falls back to the repository name when building API-Ref URLs using
API_REF_SERVICE_MAPPING.get(project_name, project_name); change this to require
an explicit mapping: look up project_name in API_REF_SERVICE_MAPPING (use
API_REF_SERVICE_MAPPING[project_name] or check 'if project_name not in
API_REF_SERVICE_MAPPING'), and if missing either raise an exception (e.g.,
ValueError) or log an error and fail fast so you don't emit incorrect
/api-ref/{project}/... URLs; also add any missing mappings (e.g., include 'zun'
-> the correct service slug) to API_REF_SERVICE_MAPPING to cover supported
API-ref projects.

Comment on lines +224 to +231
if ! grep -q "text-api-ref" tox.ini; then
# Adjust the target if it's api-guide instead of api-ref
local adjusted_target
adjusted_target="${tox_text_api_ref_target//api-ref/$api_dir}"
echo "$adjusted_target" >> tox.ini
fi

if ! tox -etext-api-ref; then
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# First, let's look at the script and understand the context
head -250 scripts/get_openstack_plaintext_docs.sh | tail -50

Repository: openstack-lightspeed/rag-content

Length of output: 2228


🏁 Script executed:

# Get more context around the problematic lines
sed -n '200,260p' scripts/get_openstack_plaintext_docs.sh

Repository: openstack-lightspeed/rag-content

Length of output: 2774


🏁 Script executed:

# Look at where tox_text_api_ref_target is set
rg "tox_text_api_ref_target" scripts/get_openstack_plaintext_docs.sh -n

Repository: openstack-lightspeed/rag-content

Length of output: 198


🏁 Script executed:

# Look at api_dir usage
rg "api_dir" scripts/get_openstack_plaintext_docs.sh -n -B2 -A2

Repository: openstack-lightspeed/rag-content

Length of output: 3138


🏁 Script executed:

# Check for pandoc references
rg "pandoc" scripts/get_openstack_plaintext_docs.sh -n -B2 -A2

Repository: openstack-lightspeed/rag-content

Length of output: 431


🏁 Script executed:

# Get the complete definition of tox_text_api_ref_target starting at line 142
sed -n '140,180p' scripts/get_openstack_plaintext_docs.sh

Repository: openstack-lightspeed/rag-content

Length of output: 1713


🏁 Script executed:

# Check if pandoc is validated anywhere in the script (startup checks)
rg "pandoc" scripts/get_openstack_plaintext_docs.sh -B5 -A5

Repository: openstack-lightspeed/rag-content

Length of output: 691


🏁 Script executed:

# Check for startup validation of tools
sed -n '1,100p' scripts/get_openstack_plaintext_docs.sh | grep -A20 "Check"

Repository: openstack-lightspeed/rag-content

Length of output: 750


🏁 Script executed:

# Look for any tool availability checks at the beginning
sed -n '1,150p' scripts/get_openstack_plaintext_docs.sh

Repository: openstack-lightspeed/rag-content

Length of output: 5564


🏁 Script executed:

# Let's verify the actual behavior by tracing through what happens with api-guide
# Create a test to show what the substitution produces
cat > /tmp/test_subst.sh << 'EOF'
#!/bin/bash

api_dir="api-guide"
tox_text_api_ref_target="
[testenv:text-api-ref]
description =
    Build API reference documentation in HTML format.
commands =
  sphinx-build --keep-going -j auto -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2}
  -r{toxinidir}/doc/requirements.txt
  os-api-ref
"

echo "=== Original tox_text_api_ref_target ==="
echo "$tox_text_api_ref_target"

echo ""
echo "=== After global substitution with api_dir=api-guide ==="
adjusted_target="${tox_text_api_ref_target//api-ref/$api_dir}"
echo "$adjusted_target"

echo ""
echo "=== What tox environment name got created ==="
echo "$adjusted_target" | grep "testenv:" 

echo ""
echo "=== Script tries to run ==="
echo "tox -etext-api-ref"
EOF

bash /tmp/test_subst.sh

Repository: openstack-lightspeed/rag-content

Length of output: 1008


The api-guide rewrite breaks the tox environment invocation.

${tox_text_api_ref_target//api-ref/$api_dir} performs a global substitution. When api_dir=api-guide, it rewrites [testenv:text-api-ref] to [testenv:text-api-guide] and os-api-ref to os-api-guide, but Line 231 still invokes tox -etext-api-ref. This causes the build to fail with "Unknown environment 'text-api-ref'" for repositories with only an api-guide directory.

The proposed fix handling only path segments (e.g., api-ref/build and api-ref/source) is incomplete—it doesn't prevent the environment name from being rewritten to text-api-guide, nor does it prevent the dependency from changing to os-api-guide. The proper fix requires either (1) keeping the environment name unchanged and building conditionally based on which directory exists, or (2) updating the hardcoded tox -etext-api-ref invocation to use the adjusted environment name.

Additionally, pandoc is invoked at line 248 without prior validation, but the startup checks only verify tox and $PYTHON.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/get_openstack_plaintext_docs.sh` around lines 224 - 231, The
substitution of tox_text_api_ref_target using
"${tox_text_api_ref_target//api-ref/$api_dir}" wrongly rewrites environment
names and other tokens; change the logic so you only rewrite path segments
inside tox_text_api_ref_target (e.g., replace occurrences of "api-ref/" or
"/api-ref" or the specific build/source path components) or compute an
adjusted_env variable (keep "text-api-ref" if the env exists, otherwise set
adjusted_env="text-${api_dir##*/}" or similar) and use that adjusted_env in the
tox invocation (replace the hardcoded "tox -etext-api-ref" with "tox
-e${adjusted_env}"); also add a pre-check that pandoc is installed before its
invocation (e.g., command -v pandoc || { echo ...; exit 1; }) to avoid running
pandoc without verification.

Comment on lines +247 to +251
# Convert HTML to plain text using pandoc (consistent output)
pandoc -f html -t plain --wrap=preserve "$html_file" -o "$text_file" || {
echo "ERROR: Failed to convert $html_file"
return 1
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# First, let's check the file size and read the startup/early sections
wc -l scripts/get_openstack_plaintext_docs.sh

Repository: openstack-lightspeed/rag-content

Length of output: 119


🏁 Script executed:

# Read the beginning of the script to find startup validation
head -100 scripts/get_openstack_plaintext_docs.sh | cat -n

Repository: openstack-lightspeed/rag-content

Length of output: 4796


🏁 Script executed:

# Search for dependency checks (tox, PYTHON, pandoc) in the script
rg -n "(command -v|which|type )" scripts/get_openstack_plaintext_docs.sh | head -20

Repository: openstack-lightspeed/rag-content

Length of output: 612


🏁 Script executed:

# Check for pandoc usage throughout the script
rg -n "pandoc" scripts/get_openstack_plaintext_docs.sh

Repository: openstack-lightspeed/rag-content

Length of output: 259


🏁 Script executed:

# Search for any pandoc availability checks in the entire script
rg -n "pandoc" scripts/get_openstack_plaintext_docs.sh

Repository: openstack-lightspeed/rag-content

Length of output: 259


🏁 Script executed:

# Check the context around lines 247-251 to understand control flow
sed -n '200,280p' scripts/get_openstack_plaintext_docs.sh | cat -n

Repository: openstack-lightspeed/rag-content

Length of output: 4434


🏁 Script executed:

# Check if there are any early checks for OS_API_DOCS and related setup
sed -n '35,150p' scripts/get_openstack_plaintext_docs.sh | cat -n

Repository: openstack-lightspeed/rag-content

Length of output: 5321


🏁 Script executed:

# Check if there's any conditional logic around pandoc that we might have missed
sed -n '210,260p' scripts/get_openstack_plaintext_docs.sh | cat -n

Repository: openstack-lightspeed/rag-content

Length of output: 2703


🏁 Script executed:

# Verify how OS_API_DOCS is used and when this code path executes
rg -B5 -A5 "OS_API_DOCS" scripts/get_openstack_plaintext_docs.sh | head -40

Repository: openstack-lightspeed/rag-content

Length of output: 1359


Add pandoc to startup dependency checks.

When OS_API_DOCS=true, the script requires pandoc for HTML-to-plain-text conversion (line 248), but currently validates only tox and PYTHON at startup. Missing pandoc won't be detected until after the HTML build completes, wasting time on unnecessary work. Add an early check to fail fast if pandoc is unavailable.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/get_openstack_plaintext_docs.sh` around lines 247 - 251, The script
currently validates startup dependencies (tox and PYTHON) but misses pandoc,
which is required when OS_API_DOCS=true before the HTML->plain conversion in the
pandoc call (used in the block referencing "$html_file" -> "$text_file"); add an
early fast-fail check so when OS_API_DOCS=true the script runs a command
existence check (e.g. command -v pandoc) and prints a clear error and exits
non-zero if pandoc is not found, matching the style used for the existing
dependency checks.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
scripts/generate_embeddings_openstack.py (1)

65-71: ⚠️ Potential issue | 🟡 Minor

Keep the fallback branch as a Path.

When relative_to() fails on line 68, line 69 assigns path_obj.name (a str), but line 71 calls .as_posix() on it, raising AttributeError. Wrap the fallback in Path() to maintain the type consistency.

Fix
         try:
             relative_path = path_obj.relative_to(self.folder_path.resolve())
         except ValueError:
-            relative_path = path_obj.name
+            relative_path = Path(path_obj.name)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate_embeddings_openstack.py` around lines 65 - 71, The fallback
branch currently sets relative_path = path_obj.name (a str) causing .as_posix()
to fail; change the except block to wrap the fallback in a Path so relative_path
remains a Path instance (i.e., use Path(path_obj.name) or Path(path).name
wrapped with Path) so that calling relative_path.as_posix() later works; locate
this logic around the variables path_obj, relative_path and self.folder_path in
the try/except where relative_to() is used and ensure the fallback produces a
Path object.
♻️ Duplicate comments (1)
scripts/generate_embeddings_openstack.py (1)

36-56: ⚠️ Potential issue | 🟠 Major

Fail fast on unmapped API-Ref services.

This map is still incomplete for projects already exercised in this PR—zun and magnum are absent here—and Line 83 silently falls back to project_name. That can generate bad docs_url values and then warn, drop, or fail the run depending on --unreachable-action. Require an explicit mapping here instead of inventing one at runtime, even if some entries are identity mappings.

🛠️ Minimal fix
-            service_name = self.API_REF_SERVICE_MAPPING.get(project_name, project_name)
+            try:
+                service_name = self.API_REF_SERVICE_MAPPING[project_name]
+            except KeyError as exc:
+                raise ValueError(
+                    f"Missing API-Ref service mapping for project '{project_name}'"
+                ) from exc

Also applies to: 82-93

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate_embeddings_openstack.py` around lines 36 - 56, The
API_REF_SERVICE_MAPPING is incomplete (missing entries like "zun" and "magnum")
and the code currently falls back to project_name when a mapping is missing;
update API_REF_SERVICE_MAPPING to include explicit mappings for all projects
exercised in this PR (at least add "zun" and "magnum" with their correct service
names) and change the lookup logic that builds docs_url to fail fast when a
project key is absent (use explicit key access on API_REF_SERVICE_MAPPING and
raise/exit with a clear error message referencing the missing project name
instead of silently falling back to project_name), so downstream behavior and
--unreachable-action handling are deterministic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@scripts/generate_embeddings_openstack.py`:
- Around line 65-71: The fallback branch currently sets relative_path =
path_obj.name (a str) causing .as_posix() to fail; change the except block to
wrap the fallback in a Path so relative_path remains a Path instance (i.e., use
Path(path_obj.name) or Path(path).name wrapped with Path) so that calling
relative_path.as_posix() later works; locate this logic around the variables
path_obj, relative_path and self.folder_path in the try/except where
relative_to() is used and ensure the fallback produces a Path object.

---

Duplicate comments:
In `@scripts/generate_embeddings_openstack.py`:
- Around line 36-56: The API_REF_SERVICE_MAPPING is incomplete (missing entries
like "zun" and "magnum") and the code currently falls back to project_name when
a mapping is missing; update API_REF_SERVICE_MAPPING to include explicit
mappings for all projects exercised in this PR (at least add "zun" and "magnum"
with their correct service names) and change the lookup logic that builds
docs_url to fail fast when a project key is absent (use explicit key access on
API_REF_SERVICE_MAPPING and raise/exit with a clear error message referencing
the missing project name instead of silently falling back to project_name), so
downstream behavior and --unreachable-action handling are deterministic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 24647331-ec92-4d8a-bfc3-ff07815ef6fc

📥 Commits

Reviewing files that changed from the base of the PR and between a3c8532 and 6061c33.

📒 Files selected for processing (2)
  • Containerfile
  • scripts/generate_embeddings_openstack.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • Containerfile

@openshift-ci
Copy link
Copy Markdown

openshift-ci Bot commented May 30, 2026

PR needs rebase.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants