Read the Docs build information Build id: 3856070 Project: canonical-lxd Version: default Commit: 870f1334217953104d0cdb289d3fedc5382e7767 Date: 2026-03-23T14:02:54.669174Z State: cancelled Success: False [rtd-command-info] start-time: 2026-03-23T14:02:55.505105Z, end-time: 2026-03-23T14:02:57.191024Z, duration: 1, exit-code: 0 git clone --depth 1 https://github.com/canonical/lxd . Cloning into '.'... [rtd-command-info] start-time: 2026-03-23T14:02:57.277927Z, end-time: 2026-03-23T14:02:58.774957Z, duration: 1, exit-code: 0 git fetch origin --force --prune --prune-tags --depth 50 refs/heads/stable-5.21:refs/remotes/origin/stable-5.21 From https://github.com/canonical/lxd * [new branch] stable-5.21 -> origin/stable-5.21 [rtd-command-info] start-time: 2026-03-23T14:02:59.562088Z, end-time: 2026-03-23T14:02:59.792267Z, duration: 0, exit-code: 0 git checkout --force origin/stable-5.21 Note: switching to 'origin/stable-5.21'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at 870f133 build(deps): bump actions/download-artifact from 8.0.0 to 8.0.1 in the actions group across 1 directory (#17944) [rtd-command-info] start-time: 2026-03-23T14:02:59.886326Z, end-time: 2026-03-23T14:02:59.928303Z, duration: 0, exit-code: 0 cat doc/.readthedocs.yaml # .readthedocs.yaml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-24.04 tools: golang: "1.25" python: "3.12" jobs: pre_install: - pip install gitpython pyyaml - git fetch --unshallow || true pre_build: - go build -ldflags "-s -w" -o trimpath -o lxc.bin ./lxc # Build documentation in the docs/ directory with Sphinx sphinx: builder: dirhtml configuration: doc/conf.py fail_on_warning: true # If using Sphinx, optionally build your docs in additional formats such as PDF formats: - pdf # Optionally declare the Python requirements required to build your docs python: install: - requirements: doc/requirements.txt [rtd-command-info] start-time: 2026-03-23T14:03:05.094532Z, end-time: 2026-03-23T14:03:05.152348Z, duration: 0, exit-code: 0 asdf global golang 1.25.4 [rtd-command-info] start-time: 2026-03-23T14:03:08.916902Z, end-time: 2026-03-23T14:03:08.975340Z, duration: 0, exit-code: 0 asdf global python 3.12.10 [rtd-command-info] start-time: 2026-03-23T14:03:09.393930Z, end-time: 2026-03-23T14:03:09.917824Z, duration: 0, exit-code: 0 python -mvirtualenv $READTHEDOCS_VIRTUALENV_PATH created virtual environment CPython3.12.10.final.0-64 in 287ms creator CPython3Posix(dest=/home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/docs/.local/share/virtualenv) added seed packages: pip==23.1, setuptools==67.6.1, wheel==0.40.0 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator [rtd-command-info] start-time: 2026-03-23T14:03:10.001386Z, end-time: 2026-03-23T14:03:12.911808Z, duration: 2, exit-code: 0 pip install gitpython pyyaml Collecting gitpython Downloading gitpython-3.1.46-py3-none-any.whl (208 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 208.6/208.6 kB 5.9 MB/s eta 0:00:00 Collecting pyyaml Downloading pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (807 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 807.9/807.9 kB 24.7 MB/s eta 0:00:00 Collecting gitdb<5,>=4.0.1 (from gitpython) Downloading gitdb-4.0.12-py3-none-any.whl (62 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 9.8 MB/s eta 0:00:00 Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->gitpython) Downloading smmap-5.0.3-py3-none-any.whl (24 kB) Installing collected packages: smmap, pyyaml, gitdb, gitpython Successfully installed gitdb-4.0.12 gitpython-3.1.46 pyyaml-6.0.3 smmap-5.0.3 [notice] A new release of pip is available: 23.1 -> 26.0.1 [notice] To update, run: pip install --upgrade pip [rtd-command-info] start-time: 2026-03-23T14:03:12.997331Z, end-time: 2026-03-23T14:03:33.536064Z, duration: 20, exit-code: 0 git fetch --unshallow || true From https://github.com/canonical/lxd * [new tag] lxd-0.1 -> lxd-0.1 * [new tag] lxd-0.10 -> lxd-0.10 * [new tag] lxd-0.11 -> lxd-0.11 * [new tag] lxd-0.12 -> lxd-0.12 * [new tag] lxd-0.13 -> lxd-0.13 * [new tag] lxd-0.14 -> lxd-0.14 * [new tag] lxd-0.15 -> lxd-0.15 * [new tag] lxd-0.16 -> lxd-0.16 * [new tag] lxd-0.17 -> lxd-0.17 * [new tag] lxd-0.18 -> lxd-0.18 * [new tag] lxd-0.19 -> lxd-0.19 * [new tag] lxd-0.2 -> lxd-0.2 * [new tag] lxd-0.20 -> lxd-0.20 * [new tag] lxd-0.21 -> lxd-0.21 * [new tag] lxd-0.22 -> lxd-0.22 * [new tag] lxd-0.23 -> lxd-0.23 * [new tag] lxd-0.24 -> lxd-0.24 * [new tag] lxd-0.25 -> lxd-0.25 * [new tag] lxd-0.26 -> lxd-0.26 * [new tag] lxd-0.27 -> lxd-0.27 * [new tag] lxd-0.3 -> lxd-0.3 * [new tag] lxd-0.4 -> lxd-0.4 * [new tag] lxd-0.5 -> lxd-0.5 * [new tag] lxd-0.6 -> lxd-0.6 * [new tag] lxd-0.7 -> lxd-0.7 * [new tag] lxd-0.8 -> lxd-0.8 * [new tag] lxd-0.8.1 -> lxd-0.8.1 * [new tag] lxd-0.9 -> lxd-0.9 * [new tag] lxd-2.0.0 -> lxd-2.0.0 * [new tag] lxd-2.0.0.beta1 -> lxd-2.0.0.beta1 * [new tag] lxd-2.0.0.beta2 -> lxd-2.0.0.beta2 * [new tag] lxd-2.0.0.beta3 -> lxd-2.0.0.beta3 * [new tag] lxd-2.0.0.beta4 -> lxd-2.0.0.beta4 * [new tag] lxd-2.0.0.rc1 -> lxd-2.0.0.rc1 * [new tag] lxd-2.0.0.rc2 -> lxd-2.0.0.rc2 * [new tag] lxd-2.0.0.rc3 -> lxd-2.0.0.rc3 * [new tag] lxd-2.0.0.rc4 -> lxd-2.0.0.rc4 * [new tag] lxd-2.0.0.rc5 -> lxd-2.0.0.rc5 * [new tag] lxd-2.0.0.rc6 -> lxd-2.0.0.rc6 * [new tag] lxd-2.0.0.rc7 -> lxd-2.0.0.rc7 * [new tag] lxd-2.0.0.rc8 -> lxd-2.0.0.rc8 * [new tag] lxd-2.0.0.rc9 -> lxd-2.0.0.rc9 * [new tag] lxd-2.1 -> lxd-2.1 * [new tag] lxd-2.10 -> lxd-2.10 * [new tag] lxd-2.10.1 -> lxd-2.10.1 * [new tag] lxd-2.11 -> lxd-2.11 * [new tag] lxd-2.12 -> lxd-2.12 * [new tag] lxd-2.13 -> lxd-2.13 * [new tag] lxd-2.14 -> lxd-2.14 * [new tag] lxd-2.15 -> lxd-2.15 * [new tag] lxd-2.16 -> lxd-2.16 * [new tag] lxd-2.17 -> lxd-2.17 * [new tag] lxd-2.18 -> lxd-2.18 * [new tag] lxd-2.19 -> lxd-2.19 * [new tag] lxd-2.2 -> lxd-2.2 * [new tag] lxd-2.20 -> lxd-2.20 * [new tag] lxd-2.21 -> lxd-2.21 * [new tag] lxd-2.3 -> lxd-2.3 * [new tag] lxd-2.4 -> lxd-2.4 * [new tag] lxd-2.4.1 -> lxd-2.4.1 * [new tag] lxd-2.5 -> lxd-2.5 * [new tag] lxd-2.6 -> lxd-2.6 * [new tag] lxd-2.6.1 -> lxd-2.6.1 * [new tag] lxd-2.6.2 -> lxd-2.6.2 * [new tag] lxd-2.7 -> lxd-2.7 * [new tag] lxd-2.8 -> lxd-2.8 * [new tag] lxd-2.9 -> lxd-2.9 * [new tag] lxd-2.9.1 -> lxd-2.9.1 * [new tag] lxd-2.9.2 -> lxd-2.9.2 * [new tag] lxd-2.9.3 -> lxd-2.9.3 * [new tag] lxd-3.0.0 -> lxd-3.0.0 * [new tag] lxd-3.0.0.beta1 -> lxd-3.0.0.beta1 * [new tag] lxd-3.0.0.beta2 -> lxd-3.0.0.beta2 * [new tag] lxd-3.0.0.beta3 -> lxd-3.0.0.beta3 * [new tag] lxd-3.0.0.beta4 -> lxd-3.0.0.beta4 * [new tag] lxd-3.0.0.beta5 -> lxd-3.0.0.beta5 * [new tag] lxd-3.0.0.beta6 -> lxd-3.0.0.beta6 * [new tag] lxd-3.0.0.beta7 -> lxd-3.0.0.beta7 * [new tag] lxd-3.1 -> lxd-3.1 * [new tag] lxd-3.10 -> lxd-3.10 * [new tag] lxd-3.11 -> lxd-3.11 * [new tag] lxd-3.12 -> lxd-3.12 * [new tag] lxd-3.13 -> lxd-3.13 * [new tag] lxd-3.14 -> lxd-3.14 * [new tag] lxd-3.15 -> lxd-3.15 * [new tag] lxd-3.16 -> lxd-3.16 * [new tag] lxd-3.17 -> lxd-3.17 * [new tag] lxd-3.18 -> lxd-3.18 * [new tag] lxd-3.19 -> lxd-3.19 * [new tag] lxd-3.2 -> lxd-3.2 * [new tag] lxd-3.20 -> lxd-3.20 * [new tag] lxd-3.21 -> lxd-3.21 * [new tag] lxd-3.22 -> lxd-3.22 * [new tag] lxd-3.23 -> lxd-3.23 * [new tag] lxd-3.3 -> lxd-3.3 * [new tag] lxd-3.4 -> lxd-3.4 * [new tag] lxd-3.5 -> lxd-3.5 * [new tag] lxd-3.6 -> lxd-3.6 * [new tag] lxd-3.7 -> lxd-3.7 * [new tag] lxd-3.8 -> lxd-3.8 * [new tag] lxd-3.9 -> lxd-3.9 * [new tag] lxd-4.0.0 -> lxd-4.0.0 * [new tag] lxd-4.1 -> lxd-4.1 * [new tag] lxd-4.10 -> lxd-4.10 * [new tag] lxd-4.11 -> lxd-4.11 * [new tag] lxd-4.12 -> lxd-4.12 * [new tag] lxd-4.13 -> lxd-4.13 * [new tag] lxd-4.14 -> lxd-4.14 * [new tag] lxd-4.15 -> lxd-4.15 * [new tag] lxd-4.16 -> lxd-4.16 * [new tag] lxd-4.17 -> lxd-4.17 * [new tag] lxd-4.18 -> lxd-4.18 * [new tag] lxd-4.19 -> lxd-4.19 * [new tag] lxd-4.2 -> lxd-4.2 * [new tag] lxd-4.20 -> lxd-4.20 * [new tag] lxd-4.21 -> lxd-4.21 * [new tag] lxd-4.22 -> lxd-4.22 * [new tag] lxd-4.23 -> lxd-4.23 * [new tag] lxd-4.24 -> lxd-4.24 * [new tag] lxd-4.3 -> lxd-4.3 * [new tag] lxd-4.4 -> lxd-4.4 * [new tag] lxd-4.5 -> lxd-4.5 * [new tag] lxd-4.6 -> lxd-4.6 * [new tag] lxd-4.7 -> lxd-4.7 * [new tag] lxd-4.8 -> lxd-4.8 * [new tag] lxd-4.9 -> lxd-4.9 * [new tag] lxd-5.0.0 -> lxd-5.0.0 * [new tag] lxd-5.1 -> lxd-5.1 * [new tag] lxd-5.10 -> lxd-5.10 * [new tag] lxd-5.11 -> lxd-5.11 * [new tag] lxd-5.12 -> lxd-5.12 * [new tag] lxd-5.13 -> lxd-5.13 * [new tag] lxd-5.14 -> lxd-5.14 * [new tag] lxd-5.15 -> lxd-5.15 * [new tag] lxd-5.16 -> lxd-5.16 * [new tag] lxd-5.17 -> lxd-5.17 * [new tag] lxd-5.18 -> lxd-5.18 * [new tag] lxd-5.19 -> lxd-5.19 * [new tag] lxd-5.2 -> lxd-5.2 * [new tag] lxd-5.20 -> lxd-5.20 * [new tag] lxd-5.21.0 -> lxd-5.21.0 * [new tag] lxd-5.21.1 -> lxd-5.21.1 * [new tag] lxd-5.21.2 -> lxd-5.21.2 * [new tag] lxd-5.21.3 -> lxd-5.21.3 * [new tag] lxd-5.21.4 -> lxd-5.21.4 * [new tag] lxd-5.3 -> lxd-5.3 * [new tag] lxd-5.4 -> lxd-5.4 * [new tag] lxd-5.5 -> lxd-5.5 * [new tag] lxd-5.6 -> lxd-5.6 * [new tag] lxd-5.7 -> lxd-5.7 * [new tag] lxd-5.8 -> lxd-5.8 * [new tag] lxd-5.9 -> lxd-5.9 * [new tag] lxd-6.1 -> lxd-6.1 * [new tag] lxd-6.2 -> lxd-6.2 * [new tag] lxd-6.3 -> lxd-6.3 * [new tag] lxd-6.4 -> lxd-6.4 * [new tag] lxd-6.5 -> lxd-6.5 * [new tag] lxd-6.6 -> lxd-6.6 * [new tag] lxd-6.7 -> lxd-6.7 * [new tag] v5.21.0 -> v5.21.0 [rtd-command-info] start-time: 2026-03-23T14:03:33.614276Z, end-time: 2026-03-23T14:03:36.794939Z, duration: 3, exit-code: 0 python -m pip install --upgrade --no-cache-dir pip setuptools Requirement already satisfied: pip in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (23.1) Collecting pip Downloading pip-26.0.1-py3-none-any.whl (1.8 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 22.6 MB/s eta 0:00:00 Requirement already satisfied: setuptools in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (67.6.1) Collecting setuptools Downloading setuptools-82.0.1-py3-none-any.whl (1.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 61.1 MB/s eta 0:00:00 Installing collected packages: setuptools, pip Attempting uninstall: setuptools Found existing installation: setuptools 67.6.1 Uninstalling setuptools-67.6.1: Successfully uninstalled setuptools-67.6.1 Attempting uninstall: pip Found existing installation: pip 23.1 Uninstalling pip-23.1: Successfully uninstalled pip-23.1 Successfully installed pip-26.0.1 setuptools-82.0.1 [rtd-command-info] start-time: 2026-03-23T14:03:36.880355Z, end-time: 2026-03-23T14:03:41.167520Z, duration: 4, exit-code: 0 python -m pip install --upgrade --no-cache-dir sphinx Collecting sphinx Downloading sphinx-9.1.0-py3-none-any.whl.metadata (5.8 kB) Collecting sphinxcontrib-applehelp>=1.0.7 (from sphinx) Downloading sphinxcontrib_applehelp-2.0.0-py3-none-any.whl.metadata (2.3 kB) Collecting sphinxcontrib-devhelp>=1.0.6 (from sphinx) Downloading sphinxcontrib_devhelp-2.0.0-py3-none-any.whl.metadata (2.3 kB) Collecting sphinxcontrib-htmlhelp>=2.0.6 (from sphinx) Downloading sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl.metadata (2.3 kB) Collecting sphinxcontrib-jsmath>=1.0.1 (from sphinx) Downloading sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl.metadata (1.4 kB) Collecting sphinxcontrib-qthelp>=1.0.6 (from sphinx) Downloading sphinxcontrib_qthelp-2.0.0-py3-none-any.whl.metadata (2.3 kB) Collecting sphinxcontrib-serializinghtml>=1.1.9 (from sphinx) Downloading sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl.metadata (2.4 kB) Collecting Jinja2>=3.1 (from sphinx) Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB) Collecting Pygments>=2.17 (from sphinx) Downloading pygments-2.19.2-py3-none-any.whl.metadata (2.5 kB) Collecting docutils<0.23,>=0.21 (from sphinx) Downloading docutils-0.22.4-py3-none-any.whl.metadata (15 kB) Collecting snowballstemmer>=2.2 (from sphinx) Downloading snowballstemmer-3.0.1-py3-none-any.whl.metadata (7.9 kB) Collecting babel>=2.13 (from sphinx) Downloading babel-2.18.0-py3-none-any.whl.metadata (2.2 kB) Collecting alabaster>=0.7.14 (from sphinx) Downloading alabaster-1.0.0-py3-none-any.whl.metadata (2.8 kB) Collecting imagesize>=1.3 (from sphinx) Downloading imagesize-2.0.0-py2.py3-none-any.whl.metadata (1.5 kB) Collecting requests>=2.30.0 (from sphinx) Downloading requests-2.32.5-py3-none-any.whl.metadata (4.9 kB) Collecting roman-numerals>=1.0.0 (from sphinx) Downloading roman_numerals-4.1.0-py3-none-any.whl.metadata (3.3 kB) Collecting packaging>=23.0 (from sphinx) Downloading packaging-26.0-py3-none-any.whl.metadata (3.3 kB) Collecting MarkupSafe>=2.0 (from Jinja2>=3.1->sphinx) Downloading markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.7 kB) Collecting charset_normalizer<4,>=2 (from requests>=2.30.0->sphinx) Downloading charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (40 kB) Collecting idna<4,>=2.5 (from requests>=2.30.0->sphinx) Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB) Collecting urllib3<3,>=1.21.1 (from requests>=2.30.0->sphinx) Downloading urllib3-2.6.3-py3-none-any.whl.metadata (6.9 kB) Collecting certifi>=2017.4.17 (from requests>=2.30.0->sphinx) Downloading certifi-2026.2.25-py3-none-any.whl.metadata (2.5 kB) Downloading sphinx-9.1.0-py3-none-any.whl (3.9 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 81.3 MB/s 0:00:00 Downloading docutils-0.22.4-py3-none-any.whl (633 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 633.2/633.2 kB 953.2 MB/s 0:00:00 Downloading alabaster-1.0.0-py3-none-any.whl (13 kB) Downloading babel-2.18.0-py3-none-any.whl (10.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.2/10.2 MB 376.0 MB/s 0:00:00 Downloading imagesize-2.0.0-py2.py3-none-any.whl (9.4 kB) Downloading jinja2-3.1.6-py3-none-any.whl (134 kB) Downloading markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB) Downloading packaging-26.0-py3-none-any.whl (74 kB) Downloading pygments-2.19.2-py3-none-any.whl (1.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 695.6 MB/s 0:00:00 Downloading requests-2.32.5-py3-none-any.whl (64 kB) Downloading charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (207 kB) Downloading idna-3.11-py3-none-any.whl (71 kB) Downloading urllib3-2.6.3-py3-none-any.whl (131 kB) Downloading certifi-2026.2.25-py3-none-any.whl (153 kB) Downloading roman_numerals-4.1.0-py3-none-any.whl (7.7 kB) Downloading snowballstemmer-3.0.1-py3-none-any.whl (103 kB) Downloading sphinxcontrib_applehelp-2.0.0-py3-none-any.whl (119 kB) Downloading sphinxcontrib_devhelp-2.0.0-py3-none-any.whl (82 kB) Downloading sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl (98 kB) Downloading sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB) Downloading sphinxcontrib_qthelp-2.0.0-py3-none-any.whl (88 kB) Downloading sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl (92 kB) Installing collected packages: urllib3, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, snowballstemmer, roman-numerals, Pygments, packaging, MarkupSafe, imagesize, idna, docutils, charset_normalizer, certifi, babel, alabaster, requests, Jinja2, sphinx Successfully installed Jinja2-3.1.6 MarkupSafe-3.0.3 Pygments-2.19.2 alabaster-1.0.0 babel-2.18.0 certifi-2026.2.25 charset_normalizer-3.4.6 docutils-0.22.4 idna-3.11 imagesize-2.0.0 packaging-26.0 requests-2.32.5 roman-numerals-4.1.0 snowballstemmer-3.0.1 sphinx-9.1.0 sphinxcontrib-applehelp-2.0.0 sphinxcontrib-devhelp-2.0.0 sphinxcontrib-htmlhelp-2.1.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-2.0.0 sphinxcontrib-serializinghtml-2.0.0 urllib3-2.6.3 [rtd-command-info] start-time: 2026-03-23T14:03:41.256498Z, end-time: 2026-03-23T14:03:47.872066Z, duration: 6, exit-code: 0 python -m pip install --exists-action=w --no-cache-dir -r doc/requirements.txt Collecting canonical-sphinx-extensions==0.0.27 (from -r doc/requirements.txt (line 1)) Downloading canonical_sphinx_extensions-0.0.27-py3-none-any.whl.metadata (15 kB) Collecting myst-parser==4.0.1 (from -r doc/requirements.txt (line 4)) Downloading myst_parser-4.0.1-py3-none-any.whl.metadata (5.5 kB) Collecting sphinx-autobuild (from -r doc/requirements.txt (line 5)) Downloading sphinx_autobuild-2025.8.25-py3-none-any.whl.metadata (8.5 kB) Collecting sphinx-design (from -r doc/requirements.txt (line 6)) Downloading sphinx_design-0.7.0-py3-none-any.whl.metadata (5.5 kB) Collecting sphinx-notfound-page (from -r doc/requirements.txt (line 7)) Downloading sphinx_notfound_page-1.1.0-py3-none-any.whl.metadata (2.9 kB) Collecting sphinx-reredirects (from -r doc/requirements.txt (line 8)) Downloading sphinx_reredirects-1.1.0-py3-none-any.whl.metadata (4.7 kB) Collecting sphinx-tabs (from -r doc/requirements.txt (line 9)) Downloading sphinx_tabs-3.5.0-py3-none-any.whl.metadata (6.6 kB) Collecting sphinxcontrib-jquery (from -r doc/requirements.txt (line 10)) Downloading sphinxcontrib_jquery-4.1-py2.py3-none-any.whl.metadata (2.6 kB) Collecting sphinxext-opengraph (from -r doc/requirements.txt (line 11)) Downloading sphinxext_opengraph-0.13.0-py3-none-any.whl.metadata (2.7 kB) Collecting furo (from -r doc/requirements.txt (line 12)) Downloading furo-2025.12.19-py3-none-any.whl.metadata (4.9 kB) Requirement already satisfied: gitpython in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from -r doc/requirements.txt (line 13)) (3.1.46) Collecting linkify-it-py (from -r doc/requirements.txt (line 14)) Downloading linkify_it_py-2.1.0-py3-none-any.whl.metadata (8.5 kB) Collecting pyspelling (from -r doc/requirements.txt (line 15)) Downloading pyspelling-2.12.1-py3-none-any.whl.metadata (3.7 kB) Requirement already satisfied: pyyaml in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from -r doc/requirements.txt (line 16)) (6.0.3) Requirement already satisfied: sphinx in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from -r doc/requirements.txt (line 17)) (9.1.0) Collecting sphinx-copybutton (from -r doc/requirements.txt (line 18)) Downloading sphinx_copybutton-0.5.2-py3-none-any.whl.metadata (3.2 kB) Collecting sphinx-remove-toctrees (from -r doc/requirements.txt (line 19)) Downloading sphinx_remove_toctrees-1.0.0.post1-py3-none-any.whl.metadata (5.8 kB) Collecting watchfiles (from -r doc/requirements.txt (line 20)) Downloading watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.9 kB) Collecting sphinx-sitemap (from -r doc/requirements.txt (line 22)) Downloading sphinx_sitemap-2.9.0-py3-none-any.whl.metadata (3.4 kB) Collecting sphinxcontrib-svg2pdfconverter[CairoSVG] (from -r doc/requirements.txt (line 21)) Downloading sphinxcontrib_svg2pdfconverter-2.1.0-py3-none-any.whl.metadata (3.3 kB) Requirement already satisfied: requests in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from canonical-sphinx-extensions==0.0.27->-r doc/requirements.txt (line 1)) (2.32.5) Collecting beautifulsoup4 (from canonical-sphinx-extensions==0.0.27->-r doc/requirements.txt (line 1)) Downloading beautifulsoup4-4.14.3-py3-none-any.whl.metadata (3.8 kB) Requirement already satisfied: docutils in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from canonical-sphinx-extensions==0.0.27->-r doc/requirements.txt (line 1)) (0.22.4) Collecting docutils (from canonical-sphinx-extensions==0.0.27->-r doc/requirements.txt (line 1)) Downloading docutils-0.21.2-py3-none-any.whl.metadata (2.8 kB) Requirement already satisfied: jinja2 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from myst-parser==4.0.1->-r doc/requirements.txt (line 4)) (3.1.6) Collecting markdown-it-py~=3.0 (from myst-parser==4.0.1->-r doc/requirements.txt (line 4)) Downloading markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB) Collecting mdit-py-plugins>=0.4.1,~=0.4 (from myst-parser==4.0.1->-r doc/requirements.txt (line 4)) Downloading mdit_py_plugins-0.5.0-py3-none-any.whl.metadata (2.8 kB) Collecting sphinx (from -r doc/requirements.txt (line 17)) Downloading sphinx-8.2.3-py3-none-any.whl.metadata (7.0 kB) Requirement already satisfied: sphinxcontrib-applehelp>=1.0.7 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (2.0.0) Requirement already satisfied: sphinxcontrib-devhelp>=1.0.6 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (2.0.0) Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.6 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (2.1.0) Requirement already satisfied: sphinxcontrib-jsmath>=1.0.1 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (1.0.1) Requirement already satisfied: sphinxcontrib-qthelp>=1.0.6 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (2.0.0) Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.9 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (2.0.0) Requirement already satisfied: Pygments>=2.17 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (2.19.2) Requirement already satisfied: snowballstemmer>=2.2 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (3.0.1) Requirement already satisfied: babel>=2.13 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (2.18.0) Requirement already satisfied: alabaster>=0.7.14 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (1.0.0) Requirement already satisfied: imagesize>=1.3 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (2.0.0) Collecting roman-numerals-py>=1.0.0 (from sphinx->-r doc/requirements.txt (line 17)) Downloading roman_numerals_py-4.1.0-py3-none-any.whl.metadata (561 bytes) Requirement already satisfied: packaging>=23.0 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from sphinx->-r doc/requirements.txt (line 17)) (26.0) Collecting mdurl~=0.1 (from markdown-it-py~=3.0->myst-parser==4.0.1->-r doc/requirements.txt (line 4)) Downloading mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB) Collecting colorama>=0.4.6 (from sphinx-autobuild->-r doc/requirements.txt (line 5)) Downloading colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB) Collecting starlette>=0.35 (from sphinx-autobuild->-r doc/requirements.txt (line 5)) Downloading starlette-1.0.0-py3-none-any.whl.metadata (6.3 kB) Collecting uvicorn>=0.25 (from sphinx-autobuild->-r doc/requirements.txt (line 5)) Downloading uvicorn-0.42.0-py3-none-any.whl.metadata (6.7 kB) Collecting websockets>=11 (from sphinx-autobuild->-r doc/requirements.txt (line 5)) Downloading websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (6.8 kB) Collecting sphinx-basic-ng>=1.0.0.beta2 (from furo->-r doc/requirements.txt (line 12)) Downloading sphinx_basic_ng-1.0.0b2-py3-none-any.whl.metadata (1.5 kB) Collecting accessible-pygments>=0.0.5 (from furo->-r doc/requirements.txt (line 12)) Downloading accessible_pygments-0.0.5-py3-none-any.whl.metadata (10 kB) Requirement already satisfied: gitdb<5,>=4.0.1 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from gitpython->-r doc/requirements.txt (line 13)) (4.0.12) Requirement already satisfied: smmap<6,>=3.0.1 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from gitdb<5,>=4.0.1->gitpython->-r doc/requirements.txt (line 13)) (5.0.3) Collecting uc-micro-py (from linkify-it-py->-r doc/requirements.txt (line 14)) Downloading uc_micro_py-2.0.0-py3-none-any.whl.metadata (2.2 kB) Collecting html5lib (from pyspelling->-r doc/requirements.txt (line 15)) Downloading html5lib-1.1-py2.py3-none-any.whl.metadata (16 kB) Collecting lxml (from pyspelling->-r doc/requirements.txt (line 15)) Downloading lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.metadata (3.6 kB) Collecting markdown (from pyspelling->-r doc/requirements.txt (line 15)) Downloading markdown-3.10.2-py3-none-any.whl.metadata (5.1 kB) Collecting soupsieve>=1.8 (from pyspelling->-r doc/requirements.txt (line 15)) Downloading soupsieve-2.8.3-py3-none-any.whl.metadata (4.6 kB) Collecting wcmatch>=8.5 (from pyspelling->-r doc/requirements.txt (line 15)) Downloading wcmatch-10.1-py3-none-any.whl.metadata (5.1 kB) Collecting anyio>=3.0.0 (from watchfiles->-r doc/requirements.txt (line 20)) Downloading anyio-4.12.1-py3-none-any.whl.metadata (4.3 kB) Collecting cairosvg>=1.0 (from sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading cairosvg-2.9.0-py3-none-any.whl.metadata (2.7 kB) Collecting sphinx-last-updated-by-git (from sphinx-sitemap->-r doc/requirements.txt (line 22)) Downloading sphinx_last_updated_by_git-0.3.8-py3-none-any.whl.metadata (7.1 kB) Requirement already satisfied: idna>=2.8 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from anyio>=3.0.0->watchfiles->-r doc/requirements.txt (line 20)) (3.11) Collecting typing_extensions>=4.5 (from anyio>=3.0.0->watchfiles->-r doc/requirements.txt (line 20)) Downloading typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB) Collecting cairocffi (from cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading cairocffi-1.7.1-py3-none-any.whl.metadata (3.3 kB) Collecting cssselect2 (from cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading cssselect2-0.9.0-py3-none-any.whl.metadata (2.9 kB) Collecting defusedxml (from cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading defusedxml-0.7.1-py2.py3-none-any.whl.metadata (32 kB) Collecting pillow (from cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (8.8 kB) Collecting tinycss2 (from cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading tinycss2-1.5.1-py3-none-any.whl.metadata (3.0 kB) Requirement already satisfied: MarkupSafe>=2.0 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from jinja2->myst-parser==4.0.1->-r doc/requirements.txt (line 4)) (3.0.3) Requirement already satisfied: charset_normalizer<4,>=2 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from requests->canonical-sphinx-extensions==0.0.27->-r doc/requirements.txt (line 1)) (3.4.6) Requirement already satisfied: urllib3<3,>=1.21.1 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from requests->canonical-sphinx-extensions==0.0.27->-r doc/requirements.txt (line 1)) (2.6.3) Requirement already satisfied: certifi>=2017.4.17 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from requests->canonical-sphinx-extensions==0.0.27->-r doc/requirements.txt (line 1)) (2026.2.25) Requirement already satisfied: roman-numerals==4.1.0 in /home/docs/checkouts/readthedocs.org/user_builds/canonical-lxd/envs/stable-5.21/lib/python3.12/site-packages (from roman-numerals-py>=1.0.0->sphinx->-r doc/requirements.txt (line 17)) (4.1.0) Collecting click>=7.0 (from uvicorn>=0.25->sphinx-autobuild->-r doc/requirements.txt (line 5)) Downloading click-8.3.1-py3-none-any.whl.metadata (2.6 kB) Collecting h11>=0.8 (from uvicorn>=0.25->sphinx-autobuild->-r doc/requirements.txt (line 5)) Downloading h11-0.16.0-py3-none-any.whl.metadata (8.3 kB) Collecting bracex>=2.1.1 (from wcmatch>=8.5->pyspelling->-r doc/requirements.txt (line 15)) Downloading bracex-2.6-py3-none-any.whl.metadata (3.6 kB) Collecting cffi>=1.1.0 (from cairocffi->cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.6 kB) Collecting pycparser (from cffi>=1.1.0->cairocffi->cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading pycparser-3.0-py3-none-any.whl.metadata (8.2 kB) Collecting webencodings (from cssselect2->cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 21)) Downloading webencodings-0.5.1-py2.py3-none-any.whl.metadata (2.1 kB) Collecting six>=1.9 (from html5lib->pyspelling->-r doc/requirements.txt (line 15)) Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB) Downloading canonical_sphinx_extensions-0.0.27-py3-none-any.whl (60 kB) Downloading myst_parser-4.0.1-py3-none-any.whl (84 kB) Downloading sphinx-8.2.3-py3-none-any.whl (3.6 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 87.2 MB/s 0:00:00 Downloading docutils-0.21.2-py3-none-any.whl (587 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 587.4/587.4 kB 851.3 MB/s 0:00:00 Downloading markdown_it_py-3.0.0-py3-none-any.whl (87 kB) Downloading mdit_py_plugins-0.5.0-py3-none-any.whl (57 kB) Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB) Downloading sphinx_autobuild-2025.8.25-py3-none-any.whl (12 kB) Downloading sphinx_design-0.7.0-py3-none-any.whl (2.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 298.5 MB/s 0:00:00 Downloading sphinx_notfound_page-1.1.0-py3-none-any.whl (8.2 kB) Downloading sphinx_reredirects-1.1.0-py3-none-any.whl (6.4 kB) Downloading sphinx_tabs-3.5.0-py3-none-any.whl (9.9 kB) Downloading sphinxcontrib_jquery-4.1-py2.py3-none-any.whl (121 kB) Downloading sphinxext_opengraph-0.13.0-py3-none-any.whl (1.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 964.6 MB/s 0:00:00 Downloading furo-2025.12.19-py3-none-any.whl (339 kB) Downloading linkify_it_py-2.1.0-py3-none-any.whl (19 kB) Downloading pyspelling-2.12.1-py3-none-any.whl (45 kB) Downloading sphinx_copybutton-0.5.2-py3-none-any.whl (13 kB) Downloading sphinx_remove_toctrees-1.0.0.post1-py3-none-any.whl (5.2 kB) Downloading watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (456 kB) Downloading sphinxcontrib_svg2pdfconverter-2.1.0-py3-none-any.whl (9.3 kB) Downloading sphinx_sitemap-2.9.0-py3-none-any.whl (6.2 kB) Downloading accessible_pygments-0.0.5-py3-none-any.whl (1.4 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4/1.4 MB 820.8 MB/s 0:00:00 Downloading anyio-4.12.1-py3-none-any.whl (113 kB) Downloading cairosvg-2.9.0-py3-none-any.whl (45 kB) Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB) Downloading roman_numerals_py-4.1.0-py3-none-any.whl (4.5 kB) Downloading soupsieve-2.8.3-py3-none-any.whl (37 kB) Downloading sphinx_basic_ng-1.0.0b2-py3-none-any.whl (22 kB) Downloading starlette-1.0.0-py3-none-any.whl (72 kB) Downloading typing_extensions-4.15.0-py3-none-any.whl (44 kB) Downloading uvicorn-0.42.0-py3-none-any.whl (68 kB) Downloading click-8.3.1-py3-none-any.whl (108 kB) Downloading h11-0.16.0-py3-none-any.whl (37 kB) Downloading wcmatch-10.1-py3-none-any.whl (39 kB) Downloading bracex-2.6-py3-none-any.whl (11 kB) Downloading websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (184 kB) Downloading beautifulsoup4-4.14.3-py3-none-any.whl (107 kB) Downloading cairocffi-1.7.1-py3-none-any.whl (75 kB) Downloading cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (219 kB) Downloading cssselect2-0.9.0-py3-none-any.whl (15 kB) Downloading defusedxml-0.7.1-py2.py3-none-any.whl (25 kB) Downloading html5lib-1.1-py2.py3-none-any.whl (112 kB) Downloading six-1.17.0-py2.py3-none-any.whl (11 kB) Downloading lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (5.3 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.3/5.3 MB 505.2 MB/s 0:00:00 Downloading markdown-3.10.2-py3-none-any.whl (108 kB) Downloading pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (7.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 452.8 MB/s 0:00:00 Downloading pycparser-3.0-py3-none-any.whl (48 kB) Downloading sphinx_last_updated_by_git-0.3.8-py3-none-any.whl (8.6 kB) Downloading tinycss2-1.5.1-py3-none-any.whl (28 kB) Downloading webencodings-0.5.1-py2.py3-none-any.whl (11 kB) Downloading uc_micro_py-2.0.0-py3-none-any.whl (6.4 kB) Installing collected packages: webencodings, websockets, uc-micro-py, typing_extensions, tinycss2, soupsieve, six, roman-numerals-py, pycparser, pillow, mdurl, markdown, lxml, h11, docutils, defusedxml, colorama, click, bracex, accessible-pygments, wcmatch, uvicorn, sphinx, markdown-it-py, linkify-it-py, html5lib, cssselect2, cffi, beautifulsoup4, anyio, watchfiles, starlette, sphinxext-opengraph, sphinxcontrib-svg2pdfconverter, sphinxcontrib-jquery, sphinx-tabs, sphinx-reredirects, sphinx-remove-toctrees, sphinx-notfound-page, sphinx-last-updated-by-git, sphinx-design, sphinx-copybutton, sphinx-basic-ng, pyspelling, mdit-py-plugins, canonical-sphinx-extensions, cairocffi, sphinx-sitemap, sphinx-autobuild, myst-parser, furo, cairosvg Attempting uninstall: docutils Found existing installation: docutils 0.22.4 Uninstalling docutils-0.22.4: Successfully uninstalled docutils-0.22.4 Attempting uninstall: sphinx Found existing installation: Sphinx 9.1.0 Uninstalling Sphinx-9.1.0: Successfully uninstalled Sphinx-9.1.0 Successfully installed accessible-pygments-0.0.5 anyio-4.12.1 beautifulsoup4-4.14.3 bracex-2.6 cairocffi-1.7.1 cairosvg-2.9.0 canonical-sphinx-extensions-0.0.27 cffi-2.0.0 click-8.3.1 colorama-0.4.6 cssselect2-0.9.0 defusedxml-0.7.1 docutils-0.21.2 furo-2025.12.19 h11-0.16.0 html5lib-1.1 linkify-it-py-2.1.0 lxml-6.0.2 markdown-3.10.2 markdown-it-py-3.0.0 mdit-py-plugins-0.5.0 mdurl-0.1.2 myst-parser-4.0.1 pillow-12.1.1 pycparser-3.0 pyspelling-2.12.1 roman-numerals-py-4.1.0 six-1.17.0 soupsieve-2.8.3 sphinx-8.2.3 sphinx-autobuild-2025.8.25 sphinx-basic-ng-1.0.0b2 sphinx-copybutton-0.5.2 sphinx-design-0.7.0 sphinx-last-updated-by-git-0.3.8 sphinx-notfound-page-1.1.0 sphinx-remove-toctrees-1.0.0.post1 sphinx-reredirects-1.1.0 sphinx-sitemap-2.9.0 sphinx-tabs-3.5.0 sphinxcontrib-jquery-4.1 sphinxcontrib-svg2pdfconverter-2.1.0 sphinxext-opengraph-0.13.0 starlette-1.0.0 tinycss2-1.5.1 typing_extensions-4.15.0 uc-micro-py-2.0.0 uvicorn-0.42.0 watchfiles-1.1.1 wcmatch-10.1 webencodings-0.5.1 websockets-16.0 [rtd-command-info] start-time: 2026-03-23T14:03:48.034103Z, end-time: 2026-03-23T14:04:07.605666Z, duration: 19, exit-code: 0 go build -ldflags "-s -w" -o trimpath -o lxc.bin ./lxc go: downloading go1.25.8 (linux/amd64) go: downloading github.com/mitchellh/mapstructure v1.5.0 go: downloading github.com/google/uuid v1.6.0 go: downloading github.com/gorilla/websocket v1.5.1 go: downloading github.com/sirupsen/logrus v1.9.4 go: downloading github.com/spf13/cobra v1.10.2 go: downloading go.yaml.in/yaml/v2 v2.4.4 go: downloading golang.org/x/crypto v0.49.0 go: downloading golang.org/x/sys v0.42.0 go: downloading golang.org/x/term v0.41.0 go: downloading github.com/zitadel/oidc/v3 v3.45.5 go: downloading github.com/fvbommel/sortorder v1.1.0 go: downloading github.com/olekukonko/tablewriter v0.0.5 go: downloading github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 go: downloading github.com/pkg/xattr v0.4.12 go: downloading github.com/pkg/sftp v1.13.10 go: downloading golang.org/x/oauth2 v0.36.0 go: downloading github.com/gosexy/gettext v0.0.0-20160830220431-74466a0a0c4a go: downloading golang.org/x/text v0.35.0 go: downloading golang.org/x/net v0.52.0 go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.7 go: downloading github.com/spf13/pflag v1.0.10 go: downloading go.yaml.in/yaml/v3 v3.0.4 go: downloading github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 go: downloading github.com/robfig/cron/v3 v3.0.1 go: downloading github.com/mattn/go-runewidth v0.0.21 go: downloading github.com/kr/fs v0.1.0 go: downloading github.com/go-jose/go-jose/v4 v4.1.3 go: downloading github.com/muhlemmer/gu v0.3.1 go: downloading github.com/zitadel/schema v1.3.2 go: downloading github.com/zitadel/logging v0.7.0 go: downloading github.com/gorilla/securecookie v1.1.2 go: downloading github.com/russross/blackfriday/v2 v2.1.0 go: downloading github.com/clipperhouse/uax29/v2 v2.7.0 go: downloading go.opentelemetry.io/otel v1.42.0 go: downloading go.opentelemetry.io/otel/trace v1.42.0 go: downloading go.opentelemetry.io/otel/metric v1.42.0 go: downloading github.com/go-logr/logr v1.4.3 go: downloading github.com/go-logr/stdr v1.2.2 go: downloading go.opentelemetry.io/auto/sdk v1.2.1 go: downloading github.com/cespare/xxhash/v2 v2.3.0 [rtd-command-info] start-time: 2026-03-23T14:04:07.689773Z, end-time: 2026-03-23T14:04:07.729585Z, duration: 0, exit-code: 0 cat doc/conf.py import datetime import os import yaml ############################ # LXD custom configuration # ############################ import sys import subprocess from git import Repo, InvalidGitRepositoryError import filecmp import ast sys.path.insert(0, os.path.abspath('.')) from redirects import redirects sys.path.append('.sphinx/') # Set global version variable used in objects.inv to numeric version defined in flex.go with open("../shared/version/flex.go") as fd: version = fd.readlines()[3].split()[-1].strip("\"") ####################### # Project information # ####################### # Project name project = 'LXD' author = 'LXD contributors' # Sidebar documentation title; best kept reasonably short # To disable the title, set to an empty string. html_title = '' # Copyright string; shown at the bottom of the page copyright = '2014-%s AGPL-3.0, %s' % (datetime.date.today().year, author) # Documentation website URL # # NOTE: The Open Graph Protocol (OGP) enhances page display in a social graph # and is used by social media platforms; see https://ogp.me/ ogp_site_url = 'https://documentation.ubuntu.com/lxd/stable-5.21/' # Preview name of the documentation website ogp_site_name = project + " documentation" # Preview image URL ogp_image = 'https://documentation.ubuntu.com/lxd/stable-5.21/_static/tag.png' # Product favicon; shown in bookmarks, browser tabs, etc. html_favicon = '.sphinx/_static/favicon.ico' # Dictionary of values to pass into the Sphinx context for all pages: # https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_context html_context = { # Product page URL; can be different from product docs URL 'product_page': 'canonical.com/lxd', # Product tag image; the orange part of your logo, shown in the page header 'product_tag': '_static/tag.png', # Your Discourse instance URL # NOTE: If set, adding ':discourse: 123' to an .rst file # will add a link to Discourse topic 123 at the bottom of the page. 'discourse': 'https://discourse.ubuntu.com/c/lxd/', # LXD docs refer to two different Discourse instances 'discourse_prefix': { 'ubuntu': 'https://discourse.ubuntu.com/t/', 'lxc': 'https://discuss.linuxcontainers.org/t/' }, # Your Mattermost channel URL 'mattermost': '', # Your Matrix channel URL 'matrix': 'https://matrix.to/#/#documentation:ubuntu.com', # Your documentation GitHub repository URL # NOTE: If set, links for viewing the documentation source files # and creating GitHub issues are added at the bottom of each page. 'github_url': 'https://github.com/canonical/lxd', # Docs branch in the repo; used in links for viewing the source files 'github_version': 'main', # Docs location in the repo; used in links for viewing the source files 'github_folder': '/doc/', # Enables the Previous / Next buttons at the bottom of pages # NOTE: Valid options are none, prev, next, both "sequential_nav": "both", # Enables listing contributors on individual pages "display_contributors": True, # Required for feedback button 'github_issues': 'enabled', } # Project slug # Required if your project is hosted on documentation.ubuntu.com slug = "lxd" ####################### # Sitemap configuration: https://sphinx-sitemap.readthedocs.io/ ####################### # Use RTD canonical URL to ensure duplicate pages have a single canonical URL # that includes the version (such as /latest/); helps SEO. # See: https://docs.readthedocs.com/platform/stable/canonical-urls.html and # https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_baseurl # Second argument is for local builds where READTHEDOCS_CANONICAL_URL is not available html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "/") # The sitemap extension uses html_baseurl to generate the full URL for each page sitemap_url_scheme = '{link}' # Include `lastmod` dates in the sitemap: sitemap_show_lastmod = True # Exclude generated pages from the sitemap: sitemap_excludes = [ '404/', 'genindex/', 'search/', ] ############# # Redirects # ############# # To set up redirects: https://documatt.gitlab.io/sphinx-reredirects/usage.html # For example: 'explanation/old-name.html': '../how-to/prettify.html', # To set up redirects in the Read the Docs project dashboard: # https://docs.readthedocs.io/en/stable/guides/redirects.html # NOTE: If undefined, set to None, or empty, # the sphinx_reredirects extension will be disabled. # redirects = {} # NOTE: LXD imports redirects from redirects.py ########################### # Link checker exceptions # ########################### # A regex list of URLs that are ignored by 'make linkcheck' # Always ignore these links linkcheck_ignore = [ r"https?://localhost.*", r"https?://127\.0\.0\.1.*", r"^/.*/api/", # These links often/always fail both locally and in GitHub CI r"https://ceph\.io.*", r"https://.*\.sourceforge\.net.*", r"https://www\.gnu\.org.*", # These links often fail due to infra issues r"https://.*\.canonical\.com.*", r"https://snapcraft\.io.*", r"https://ubuntu\.com.*", r"https://.*\.launchpad\.net.*", # Ignore so that we can link change log in release notes before a release is ready r"https://github\.com/canonical/lxd/compare.*", r'https://kubernetes\.io/.*', ] # Ignore these links in GitHub CI due to site restrictions causing failures # In local checks, they are not ignored and should pass if os.environ.get("CI") == "true": linkcheck_ignore.extend([ r"https://www\.hpe\.com.*", r"https://www\.schlachter\.tech.*", r"https://www\.dell\.com.*", ]) # Pages on which to ignore anchors # (This list will be appended to linkcheck_anchors_ignore_for_url) linkcheck_anchors_ignore_for_url = [ r'https://github\.com/.*', r'https://snapcraft\.io/docs/.*', 'https://docs.docker.com/network/packet-filtering-firewalls/', 'https://maas.io/docs/how-to-manage-machines', 'https://web.libera.chat' ] linkcheck_exclude_documents = [r'.*/manpages/.*'] # Increase linkcheck rate limit timeout max; default when unset is 300 # https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-linkcheck_timeout linkcheck_rate_limit_timeout = 600 # Increase linkcheck retries; default when unset is 1 # https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-linkcheck_retries linkcheck_retries = 3 ######################## # Configuration extras # ######################## extensions = [ 'sphinx_tabs.tabs', 'canonical.youtube-links', 'canonical.related-links', 'canonical.custom-rst-roles', 'canonical.terminal-output', 'notfound.extension', 'sphinx.ext.intersphinx', 'canonical.config-options', 'sphinx_remove_toctrees', 'canonical.filtered-toc', 'sphinxcontrib.cairosvgconverter', 'sphinx_sitemap', 'sphinxext.opengraph', 'sphinx_reredirects', 'sphinx_design', 'sphinx_copybutton', 'sphinxcontrib.jquery', 'myst_parser', ] # Additional MyST syntax myst_enable_extensions = [ 'substitution', 'deflist', 'linkify', 'attrs_block', ] ### Configuration for extensions # Used for related links if not 'discourse_prefix' in html_context and 'discourse' in html_context: html_context['discourse_prefix'] = html_context['discourse'] + '/t/' # The URL prefix for the notfound extension depends on whether the documentation uses versions. # For documentation on documentation.ubuntu.com, we also must add the slug. url_version = '' url_lang = '' # Determine if the URL uses versions and language if 'READTHEDOCS_CANONICAL_URL' in os.environ and os.environ['READTHEDOCS_CANONICAL_URL']: url_parts = os.environ['READTHEDOCS_CANONICAL_URL'].split('/') if len(url_parts) >= 2 and 'READTHEDOCS_VERSION' in os.environ and os.environ['READTHEDOCS_VERSION'] == url_parts[-2]: url_version = url_parts[-2] + '/' if len(url_parts) >= 3 and 'READTHEDOCS_LANGUAGE' in os.environ and os.environ['READTHEDOCS_LANGUAGE'] == url_parts[-3]: url_lang = url_parts[-3] + '/' # Set notfound_urls_prefix to the slug (if defined) and the version/language affix if slug: notfound_urls_prefix = '/' + slug + '/' + url_lang + url_version elif len(url_lang + url_version) > 0: notfound_urls_prefix = '/' + url_lang + url_version else: notfound_urls_prefix = '' notfound_context = { 'title': 'Page not found', 'body': '

Sorry, but the documentation page that you are looking for was not found.

\n\n

Documentation changes over time, and pages are moved around. We try to redirect you to the updated content where possible, but unfortunately, that didn\'t work this time (maybe because the content you were looking for does not exist in this version of the documentation).

\n

You can try to use the navigation to locate the content you\'re looking for, or search for a similar page.

\n', } exclude_patterns = [ '_build', 'Thumbs.db', '.DS_Store', '.sphinx', 'html', 'README.md', 'config_options_cheat_sheet.md' ] # By default, the documentation includes a feedback button at the top. # You can disable it by setting the following configuration to True. disable_feedback_button = False source_suffix = { '.rst': 'restructuredtext', '.md': 'markdown', } if not 'conf_py_path' in html_context and 'github_folder' in html_context: html_context['conf_py_path'] = html_context['github_folder'] # html_context['get_contribs'] is a function and cannot be # cached (see https://github.com/sphinx-doc/sphinx/issues/12300) suppress_warnings = ["config.cache"] ############################################################ ### Styling ############################################################ # Find the current builder builder = 'dirhtml' if '-b' in sys.argv: builder = sys.argv[sys.argv.index('-b')+1] # Setting templates_path for epub makes the build fail if builder == 'dirhtml' or builder == 'html': templates_path = ['.sphinx/_templates'] notfound_template = '404.html' # Theme configuration html_theme = 'furo' html_last_updated_fmt = '' html_permalinks_icon = '¶' if html_title == '': html_theme_options = { 'sidebar_hide_name': True } ############################################################ ### Additional files ############################################################ html_static_path = ['.sphinx/_static'] html_css_files = [ 'custom.css', 'header.css', 'github_issue_links.css', 'furo_colors.css', 'footer.css', 'cookie-banner.css', ] html_js_files = ['header-nav.js', 'footer.js', 'js/bundle.js'] if 'github_issues' in html_context and html_context['github_issues'] and not disable_feedback_button: html_js_files.append('github_issue_links.js') ############################################################# # Display the contributors def get_contributors_for_file(github_url, github_folder, pagename, page_source_suffix, display_contributors_since=None): filename = f"{pagename}{page_source_suffix}" paths=html_context['github_folder'][1:] + filename try: repo = Repo(".") except InvalidGitRepositoryError: cwd = os.getcwd() ghfolder = html_context['github_folder'][:-1] if ghfolder and cwd.endswith(ghfolder): repo = Repo(cwd.rpartition(ghfolder)[0]) else: print("The local Git repository could not be found.") return since = display_contributors_since if display_contributors_since and display_contributors_since.strip() else None commits = repo.iter_commits(paths=paths, since=since) contributors_dict = {} for commit in commits: contributor = commit.author.name if contributor not in contributors_dict or commit.committed_date > contributors_dict[contributor]['date']: contributors_dict[contributor] = { 'date': commit.committed_date, 'sha': commit.hexsha } # The github_page contains the link to the contributor's latest commit. contributors_list = [{'name': name, 'github_page': f"{github_url}/commit/{data['sha']}"} for name, data in contributors_dict.items()] sorted_contributors_list = sorted(contributors_list, key=lambda x: x['name']) return sorted_contributors_list html_context['get_contribs'] = get_contributors_for_file ############################################################ ### PDF configuration ############################################################ latex_additional_files = [ "./.sphinx/fonts/Ubuntu-B.ttf", "./.sphinx/fonts/Ubuntu-R.ttf", "./.sphinx/fonts/Ubuntu-RI.ttf", "./.sphinx/fonts/UbuntuMono-R.ttf", "./.sphinx/fonts/UbuntuMono-RI.ttf", "./.sphinx/fonts/UbuntuMono-B.ttf", "./.sphinx/images/Canonical-logo-4x.png", "./.sphinx/images/front-page-light.pdf", "./.sphinx/images/normal-page-footer.pdf", ] latex_engine = 'xelatex' latex_show_pagerefs = True latex_show_urls = 'footnote' with open(".sphinx/latex_elements_template.txt", "rt") as file: latex_config = file.read() latex_elements = ast.literal_eval(latex_config.replace("$PROJECT", project)) ############################################################ ### Misc LXD custom configuration ############################################################ # Prevents making links from URLs that do not start with a protocol myst_linkify_fuzzy_links = False # Auto-generate HTML anchors down to heading level 7 # https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#auto-generated-header-anchors myst_heading_anchors = 7 if os.path.exists('./substitutions.yaml'): with open('./substitutions.yaml', 'r') as fd: myst_substitutions = yaml.safe_load(fd.read()) if os.path.exists('./related_topics.yaml'): with open('./related_topics.yaml', 'r') as fd: myst_substitutions.update(yaml.safe_load(fd.read())) if ('LOCAL_SPHINX_BUILD' in os.environ) and (os.environ['LOCAL_SPHINX_BUILD'] == 'True'): swagger_url_scheme = '/api/#{{path}}' else: swagger_url_scheme = '/lxd/stable-5.21/api/#{{path}}' myst_url_schemes = { 'http': None, 'https': None, 'swagger': swagger_url_scheme, } remove_from_toctrees = ['reference/manpages/lxc/*.md'] intersphinx_mapping = { 'cloud-init': ('https://cloudinit.readthedocs.io/en/latest/', None), 'imagebuilder': ('https://canonical-lxd-imagebuilder.readthedocs-hosted.com/en/latest/', None) } html_extra_path = ['.sphinx/_extra'] # Download and link swagger-ui files if not os.path.isdir('.sphinx/deps/swagger-ui'): Repo.clone_from('https://github.com/swagger-api/swagger-ui', '.sphinx/deps/swagger-ui', depth=1) os.makedirs('.sphinx/_static/swagger-ui/', exist_ok=True) if not os.path.islink('.sphinx/_static/swagger-ui/swagger-ui-bundle.js'): os.symlink('../../deps/swagger-ui/dist/swagger-ui-bundle.js', '.sphinx/_static/swagger-ui/swagger-ui-bundle.js') if not os.path.islink('.sphinx/_static/swagger-ui/swagger-ui-standalone-preset.js'): os.symlink('../../deps/swagger-ui/dist/swagger-ui-standalone-preset.js', '.sphinx/_static/swagger-ui/swagger-ui-standalone-preset.js') if not os.path.islink('.sphinx/_static/swagger-ui/swagger-ui.css'): os.symlink('../../deps/swagger-ui/dist/swagger-ui.css', '.sphinx/_static/swagger-ui/swagger-ui.css') ### MAN PAGES ### # Find path to lxc client (different for local builds and on RTD) if ('LOCAL_SPHINX_BUILD' in os.environ and os.environ['LOCAL_SPHINX_BUILD'] == 'True'): path = str(subprocess.check_output(['go', 'env', 'GOPATH'], encoding='utf-8').strip()) lxc = os.path.join(path, 'bin', 'lxc') if os.path.isfile(lxc): print('Using ' + lxc + ' to generate man pages.') else: print('Cannot find lxc in ' + lxc) exit(2) else: lxc = '../lxc.bin' # Generate man pages content os.makedirs('.sphinx/deps/manpages', exist_ok=True) if (os.path.isfile(lxc)): subprocess.run([lxc, 'manpage', '.sphinx/deps/manpages/', '--format=md'], check=True) else: print('No man page content generated.') # Preprocess man pages content for page in [x for x in os.listdir('.sphinx/deps/manpages') if os.path.isfile(os.path.join('.sphinx/deps/manpages/', x))]: # replace underscores with slashes to create a directory structure pagepath = page.replace('_', '/') # for each generated page, add an anchor, fix the title, and adjust the # heading levels with open(os.path.join('.sphinx/deps/manpages/', page), 'r') as mdfile: content = mdfile.readlines() os.makedirs(os.path.dirname(os.path.join('.sphinx/deps/manpages/', pagepath)), exist_ok=True) with open(os.path.join('.sphinx/deps/manpages/', pagepath), 'w') as mdfile: mdfile.write('(' + page + ')=\n') for line in content: if line.startswith('###### Auto generated'): continue elif line.startswith('## '): mdfile.write('# `' + line[3:].rstrip() + '`\n') elif line.startswith('##'): mdfile.write(line[1:]) else: mdfile.write(line) # remove the input page (unless the file path doesn't change) if '_' in page: os.remove(os.path.join('.sphinx/deps/manpages/', page)) # Complete and copy man pages content for folder, subfolders, files in os.walk('.sphinx/deps/manpages'): # for each subfolder, add toctrees to the parent page that # include the subpages for subfolder in subfolders: with open(os.path.join(folder, subfolder + '.md'), 'a') as parent: parent.write('```{toctree}\n:titlesonly:\n:glob:\n:hidden:\n\n' + subfolder + '/*\n```\n') # for each file, if the content is different to what has been generated # before, copy the file to the reference/manpages folder # (copying all would mess up the incremental build) for f in files: sourcefile = os.path.join(folder, f) targetfile = os.path.join('reference/manpages/', os.path.relpath(folder, '.sphinx/deps/manpages'), f) if (not os.path.isfile(targetfile) or not filecmp.cmp(sourcefile, targetfile, shallow=False)): os.makedirs(os.path.dirname(targetfile), exist_ok=True) os.system('cp ' + sourcefile + ' ' + targetfile) ### End MAN PAGES ### exclude_patterns.extend(['security.md', 'external_resources.md', 'reference/network_external.md']) redirects['security/index'] = '../explanation/security/' tags.add('diataxis') toc_filter_exclude = ['topical'] sys.path.append(os.path.abspath('.sphinx/_extensions/')) [rtd-command-info] start-time: None, end-time: None, duration: None, exit-code: None python -m sphinx -T -W --keep-going -b dirhtml -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html