Read the Docs build information Build id: 3636329 Project: canonical-lxd Version: default Commit: 6b22bcee81fdbbce600bbd1fe4925549bbefb9e6 Date: 2026-01-05T08:18:30.070129Z State: cancelled Success: False [rtd-command-info] start-time: 2026-01-05T08:18:31.331761Z, end-time: 2026-01-05T08:18:33.833261Z, duration: 2, exit-code: 0 git clone --depth 1 https://github.com/canonical/lxd . Cloning into '.'... [rtd-command-info] start-time: 2026-01-05T08:18:33.946099Z, end-time: 2026-01-05T08:18:35.656502Z, 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-01-05T08:18:36.378292Z, end-time: 2026-01-05T08:18:36.627282Z, 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 6b22bce build(deps): bump actions/upload-artifact from 5.0.0 to 6.0.0 (#17303) [rtd-command-info] start-time: 2026-01-05T08:18:36.709915Z, end-time: 2026-01-05T08:18:36.753235Z, 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-01-05T08:18:43.026651Z, end-time: 2026-01-05T08:18:43.096194Z, duration: 0, exit-code: 0 asdf global golang 1.25.4 [rtd-command-info] start-time: 2026-01-05T08:18:47.642507Z, end-time: 2026-01-05T08:18:47.708734Z, duration: 0, exit-code: 0 asdf global python 3.12.10 [rtd-command-info] start-time: 2026-01-05T08:18:48.160164Z, end-time: 2026-01-05T08:18:49.274380Z, duration: 1, exit-code: 0 python -mvirtualenv $READTHEDOCS_VIRTUALENV_PATH created virtual environment CPython3.12.10.final.0-64 in 806ms 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-01-05T08:18:49.364385Z, end-time: 2026-01-05T08:18:55.810742Z, duration: 6, 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 956.2 kB/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 27.2 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 14.4 MB/s eta 0:00:00 Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->gitpython) Downloading smmap-5.0.2-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.2 [notice] A new release of pip is available: 23.1 -> 25.3 [notice] To update, run: pip install --upgrade pip [rtd-command-info] start-time: 2026-01-05T08:18:55.911006Z, end-time: 2026-01-05T08:19:20.546822Z, duration: 24, exit-code: 0 git fetch --unshallow || true From https://github.com/canonical/lxd 232493396a..40b39f723a main -> origin/main * [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] v5.21.0 -> v5.21.0 [rtd-command-info] start-time: 2026-01-05T08:19:20.656456Z, end-time: 2026-01-05T08:19:23.776246Z, 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-25.3-py3-none-any.whl (1.8 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 40.0 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-80.9.0-py3-none-any.whl (1.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 278.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-25.3 setuptools-80.9.0 [rtd-command-info] start-time: 2026-01-05T08:19:23.892936Z, end-time: 2026-01-05T08:19:28.808861Z, 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.17.0-py3-none-any.whl.metadata (2.0 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-1.4.1-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-25.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.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (37 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.2-py3-none-any.whl.metadata (6.6 kB) Collecting certifi>=2017.4.17 (from requests>=2.30.0->sphinx) Downloading certifi-2026.1.4-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 177.1 MB/s 0:00:00 Downloading docutils-0.22.4-py3-none-any.whl (633 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 633.2/633.2 kB 325.9 MB/s 0:00:00 Downloading alabaster-1.0.0-py3-none-any.whl (13 kB) Downloading babel-2.17.0-py3-none-any.whl (10.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.2/10.2 MB 390.8 MB/s 0:00:00 Downloading imagesize-1.4.1-py2.py3-none-any.whl (8.8 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-25.0-py3-none-any.whl (66 kB) Downloading pygments-2.19.2-py3-none-any.whl (1.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 613.1 MB/s 0:00:00 Downloading requests-2.32.5-py3-none-any.whl (64 kB) Downloading charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (153 kB) Downloading idna-3.11-py3-none-any.whl (71 kB) Downloading urllib3-2.6.2-py3-none-any.whl (131 kB) Downloading certifi-2026.1.4-py3-none-any.whl (152 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.17.0 certifi-2026.1.4 charset_normalizer-3.4.4 docutils-0.22.4 idna-3.11 imagesize-1.4.1 packaging-25.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.2 [rtd-command-info] start-time: 2026-01-05T08:19:28.925994Z, end-time: 2026-01-05T08:19:36.172185Z, duration: 7, exit-code: 0 python -m pip install --exists-action=w --no-cache-dir -r doc/requirements.txt Collecting canonical-sphinx-extensions (from -r doc/requirements.txt (line 1)) Downloading canonical_sphinx_extensions-0.0.34-py3-none-any.whl.metadata (16 kB) Collecting myst-parser (from -r doc/requirements.txt (line 3)) Downloading myst_parser-4.0.1-py3-none-any.whl.metadata (5.5 kB) Collecting sphinx-autobuild (from -r doc/requirements.txt (line 4)) Downloading sphinx_autobuild-2025.8.25-py3-none-any.whl.metadata (8.5 kB) Collecting sphinx-design (from -r doc/requirements.txt (line 5)) Downloading sphinx_design-0.6.1-py3-none-any.whl.metadata (5.5 kB) Collecting sphinx-notfound-page (from -r doc/requirements.txt (line 6)) Downloading sphinx_notfound_page-1.1.0-py3-none-any.whl.metadata (2.9 kB) Collecting sphinx-reredirects (from -r doc/requirements.txt (line 7)) Downloading sphinx_reredirects-1.1.0-py3-none-any.whl.metadata (4.7 kB) Collecting sphinx-tabs (from -r doc/requirements.txt (line 8)) Downloading sphinx_tabs-3.4.7-py3-none-any.whl.metadata (6.3 kB) Collecting sphinxcontrib-jquery (from -r doc/requirements.txt (line 9)) Downloading sphinxcontrib_jquery-4.1-py2.py3-none-any.whl.metadata (2.6 kB) Collecting sphinxext-opengraph (from -r doc/requirements.txt (line 10)) Downloading sphinxext_opengraph-0.13.0-py3-none-any.whl.metadata (2.7 kB) Collecting furo (from -r doc/requirements.txt (line 11)) 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 12)) (3.1.46) Collecting linkify-it-py (from -r doc/requirements.txt (line 13)) Downloading linkify_it_py-2.0.3-py3-none-any.whl.metadata (8.5 kB) Collecting pyspelling (from -r doc/requirements.txt (line 14)) 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 15)) (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 16)) (9.1.0) Collecting sphinx-copybutton (from -r doc/requirements.txt (line 17)) Downloading sphinx_copybutton-0.5.2-py3-none-any.whl.metadata (3.2 kB) Collecting sphinx-remove-toctrees (from -r doc/requirements.txt (line 18)) Downloading sphinx_remove_toctrees-1.0.0.post1-py3-none-any.whl.metadata (5.8 kB) Collecting watchfiles (from -r doc/requirements.txt (line 19)) 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 21)) Downloading sphinx_sitemap-2.9.0-py3-none-any.whl.metadata (3.4 kB) Collecting sphinxcontrib-svg2pdfconverter[CairoSVG] (from -r doc/requirements.txt (line 20)) Downloading sphinxcontrib_svg2pdfconverter-2.0.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->-r doc/requirements.txt (line 1)) (2.32.5) Collecting beautifulsoup4 (from canonical-sphinx-extensions->-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->-r doc/requirements.txt (line 1)) (0.22.4) Collecting docutils (from canonical-sphinx-extensions->-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->-r doc/requirements.txt (line 3)) (3.1.6) Collecting markdown-it-py~=3.0 (from myst-parser->-r doc/requirements.txt (line 3)) 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->-r doc/requirements.txt (line 3)) Downloading mdit_py_plugins-0.5.0-py3-none-any.whl.metadata (2.8 kB) Collecting sphinx (from -r doc/requirements.txt (line 16)) 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 16)) (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 16)) (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 16)) (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 16)) (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 16)) (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 16)) (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 16)) (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 16)) (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 16)) (2.17.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 16)) (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 16)) (1.4.1) Collecting roman-numerals-py>=1.0.0 (from sphinx->-r doc/requirements.txt (line 16)) 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 16)) (25.0) Collecting mdurl~=0.1 (from markdown-it-py~=3.0->myst-parser->-r doc/requirements.txt (line 3)) 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 4)) 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 4)) Downloading starlette-0.50.0-py3-none-any.whl.metadata (6.3 kB) Collecting uvicorn>=0.25 (from sphinx-autobuild->-r doc/requirements.txt (line 4)) Downloading uvicorn-0.40.0-py3-none-any.whl.metadata (6.7 kB) Collecting websockets>=11 (from sphinx-autobuild->-r doc/requirements.txt (line 4)) Downloading websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.8 kB) Collecting sphinx-basic-ng>=1.0.0.beta2 (from furo->-r doc/requirements.txt (line 11)) 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 11)) 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 12)) (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 12)) (5.0.2) Collecting uc-micro-py (from linkify-it-py->-r doc/requirements.txt (line 13)) Downloading uc_micro_py-1.0.3-py3-none-any.whl.metadata (2.0 kB) Collecting html5lib (from pyspelling->-r doc/requirements.txt (line 14)) Downloading html5lib-1.1-py2.py3-none-any.whl.metadata (16 kB) Collecting lxml (from pyspelling->-r doc/requirements.txt (line 14)) 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 14)) Downloading markdown-3.10-py3-none-any.whl.metadata (5.1 kB) Collecting soupsieve>=1.8 (from pyspelling->-r doc/requirements.txt (line 14)) Downloading soupsieve-2.8.1-py3-none-any.whl.metadata (4.6 kB) Collecting wcmatch>=8.5 (from pyspelling->-r doc/requirements.txt (line 14)) Downloading wcmatch-10.1-py3-none-any.whl.metadata (5.1 kB) Collecting anyio>=3.0.0 (from watchfiles->-r doc/requirements.txt (line 19)) Downloading anyio-4.12.0-py3-none-any.whl.metadata (4.3 kB) Collecting cairosvg>=1.0 (from sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 20)) Downloading cairosvg-2.8.2-py3-none-any.whl.metadata (2.7 kB) Collecting sphinx-last-updated-by-git (from sphinx-sitemap->-r doc/requirements.txt (line 21)) 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 19)) (3.11) Collecting typing_extensions>=4.5 (from anyio>=3.0.0->watchfiles->-r doc/requirements.txt (line 19)) 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 20)) 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 20)) Downloading cssselect2-0.8.0-py3-none-any.whl.metadata (2.9 kB) Collecting defusedxml (from cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 20)) 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 20)) Downloading pillow-12.1.0-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 20)) 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->-r doc/requirements.txt (line 3)) (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->-r doc/requirements.txt (line 1)) (3.4.4) 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->-r doc/requirements.txt (line 1)) (2.6.2) 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->-r doc/requirements.txt (line 1)) (2026.1.4) 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 16)) (4.1.0) Collecting click>=7.0 (from uvicorn>=0.25->sphinx-autobuild->-r doc/requirements.txt (line 4)) 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 4)) 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 14)) 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 20)) 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 20)) Downloading pycparser-2.23-py3-none-any.whl.metadata (993 bytes) Collecting webencodings (from cssselect2->cairosvg>=1.0->sphinxcontrib-svg2pdfconverter[CairoSVG]->-r doc/requirements.txt (line 20)) 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 14)) Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB) Downloading canonical_sphinx_extensions-0.0.34-py3-none-any.whl (67 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 179.0 MB/s 0:00:00 Downloading docutils-0.21.2-py3-none-any.whl (587 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 587.4/587.4 kB 582.9 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.6.1-py3-none-any.whl (2.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 485.9 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.4.7-py3-none-any.whl (9.7 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 643.9 MB/s 0:00:00 Downloading furo-2025.12.19-py3-none-any.whl (339 kB) Downloading linkify_it_py-2.0.3-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.0.0-py3-none-any.whl (8.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 644.0 MB/s 0:00:00 Downloading anyio-4.12.0-py3-none-any.whl (113 kB) Downloading cairosvg-2.8.2-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.1-py3-none-any.whl (36 kB) Downloading sphinx_basic_ng-1.0.0b2-py3-none-any.whl (22 kB) Downloading starlette-0.50.0-py3-none-any.whl (74 kB) Downloading typing_extensions-4.15.0-py3-none-any.whl (44 kB) Downloading uvicorn-0.40.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-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (182 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.8.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 432.6 MB/s 0:00:00 Downloading markdown-3.10-py3-none-any.whl (107 kB) Downloading pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (7.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 458.9 MB/s 0:00:00 Downloading pycparser-2.23-py3-none-any.whl (118 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-1.0.3-py3-none-any.whl (6.2 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.0 beautifulsoup4-4.14.3 bracex-2.6 cairocffi-1.7.1 cairosvg-2.8.2 canonical-sphinx-extensions-0.0.34 cffi-2.0.0 click-8.3.1 colorama-0.4.6 cssselect2-0.8.0 defusedxml-0.7.1 docutils-0.21.2 furo-2025.12.19 h11-0.16.0 html5lib-1.1 linkify-it-py-2.0.3 lxml-6.0.2 markdown-3.10 markdown-it-py-3.0.0 mdit-py-plugins-0.5.0 mdurl-0.1.2 myst-parser-4.0.1 pillow-12.1.0 pycparser-2.23 pyspelling-2.12.1 roman-numerals-py-4.1.0 six-1.17.0 soupsieve-2.8.1 sphinx-8.2.3 sphinx-autobuild-2025.8.25 sphinx-basic-ng-1.0.0b2 sphinx-copybutton-0.5.2 sphinx-design-0.6.1 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.4.7 sphinxcontrib-jquery-4.1 sphinxcontrib-svg2pdfconverter-2.0.0 sphinxext-opengraph-0.13.0 starlette-0.50.0 tinycss2-1.5.1 typing_extensions-4.15.0 uc-micro-py-1.0.3 uvicorn-0.40.0 watchfiles-1.1.1 wcmatch-10.1 webencodings-0.5.1 websockets-15.0.1 [rtd-command-info] start-time: 2026-01-05T08:19:36.412776Z, end-time: 2026-01-05T08:20:15.439373Z, duration: 39, exit-code: 0 go build -ldflags "-s -w" -o trimpath -o lxc.bin ./lxc go: downloading github.com/google/uuid v1.6.0 go: downloading github.com/gorilla/websocket v1.5.1 go: downloading github.com/mitchellh/mapstructure v1.5.0 go: downloading github.com/sirupsen/logrus v1.9.3 go: downloading github.com/spf13/cobra v1.10.2 go: downloading go.yaml.in/yaml/v2 v2.4.3 go: downloading golang.org/x/crypto v0.45.0 go: downloading golang.org/x/sys v0.39.0 go: downloading golang.org/x/term v0.38.0 go: downloading github.com/zitadel/oidc/v3 v3.45.1 go: downloading github.com/pkg/sftp v1.13.10 go: downloading golang.org/x/oauth2 v0.34.0 go: downloading github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 go: downloading github.com/pkg/xattr v0.4.12 go: downloading github.com/fvbommel/sortorder v1.1.0 go: downloading github.com/olekukonko/tablewriter v0.0.5 go: downloading github.com/gosexy/gettext v0.0.0-20160830220431-74466a0a0c4a go: downloading golang.org/x/text v0.31.0 go: downloading golang.org/x/net v0.47.0 go: downloading github.com/spf13/pflag v1.0.10 go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.7 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/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.1 go: downloading github.com/gorilla/securecookie v1.1.2 go: downloading github.com/zitadel/logging v0.6.2 go: downloading github.com/mattn/go-runewidth v0.0.19 go: downloading github.com/russross/blackfriday/v2 v2.1.0 go: downloading github.com/clipperhouse/uax29/v2 v2.3.0 go: downloading go.opentelemetry.io/otel v1.38.0 go: downloading go.opentelemetry.io/otel/trace v1.38.0 go: downloading github.com/clipperhouse/stringish v0.1.1 go: downloading github.com/go-logr/logr v1.4.3 go: downloading go.opentelemetry.io/otel/metric v1.38.0 go: downloading github.com/go-logr/stdr v1.2.2 go: downloading go.opentelemetry.io/auto/sdk v1.2.1 [rtd-command-info] start-time: 2026-01-05T08:20:15.552687Z, end-time: 2026-01-05T08:20:15.602706Z, 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