diff --git a/.codecov.yml b/.codecov.yml index ef8fb9e5929..c0092974257 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -168,13 +168,7 @@ coverage: # - excluding: **/test_*.py # paths: ["python3/**", "!**/test_*.py"] - - # - # For python3/** (excluding tests): - # - # For python3, coverage should not be reduced compared to its base: - # - target: auto + target: 80% # # Exception: the threshold value given is allowed @@ -183,12 +177,6 @@ coverage: # threshold: 20% - # Checks each Python version separately: - python-3.11: - flags: ["python3.11"] - python-2.7: - flags: ["python2.7"] - # # Project limits # -------------- @@ -218,7 +206,7 @@ coverage: tests: # Ensure that all tests are executed (tests themselves must be 100% covered) target: 98% - paths: ["**/test_*.py"] + paths: ["python3/tests/test_*.py"] # @@ -235,24 +223,15 @@ component_management: - type: project # `auto` will use the coverage from the base commit (pull request base # or parent commit) coverage to compare against. - target: auto + target: 48 threshold: 2% - type: patch - target: auto - threshold: 10% + target: 80 + threshold: 5% individual_components: - - component_id: scripts # this is an identifier that should not be changed - name: scripts # this is a display name, and can be changed freely - # The list of paths that should be in- and excluded in this component: - paths: ["scripts/**", "!scripts/examples/**", "!**/test_*.py"] - - - component_id: scripts/examples - name: scripts/examples - paths: ["scripts/examples/**", "!scripts/**/test_*.py"] - - component_id: ocaml name: ocaml paths: ["ocaml/**", "!**/test_*.py"] @@ -270,4 +249,5 @@ component_management: - component_id: test_cases name: test_cases - paths: ["**/test_*.py"] + paths: ["python3/tests/test_*.py"] + diff --git a/.github/workflows/generate-and-build-sdks.yml b/.github/workflows/generate-and-build-sdks.yml index 78ec2579a7f..87da4b1d8f5 100644 --- a/.github/workflows/generate-and-build-sdks.yml +++ b/.github/workflows/generate-and-build-sdks.yml @@ -47,6 +47,14 @@ jobs: name: SDK_Source_PowerShell path: _build/install/default/xapi/sdk/powershell/* + - name: Store Go SDK Artifacts + uses: actions/upload-artifact@v4 + with: + name: SDK_Artifacts_Go + path: | + _build/install/default/xapi/sdk/go/* + !_build/install/default/xapi/sdk/go/dune + - name: Trim dune cache run: opam exec -- dune cache trim --size=2GiB diff --git a/.github/workflows/other.yml b/.github/workflows/other.yml index d65b7abe575..57d4c1d2207 100644 --- a/.github/workflows/other.yml +++ b/.github/workflows/other.yml @@ -56,7 +56,7 @@ jobs: - name: Install common dependencies for Python ${{matrix.python-version}} run: pip install future mock pytest-coverage pytest-mock - - name: Run Pytest for python 2 and get code coverage for Codecov + - name: Run Pytest for python 2 and get code coverage if: ${{ matrix.python-version == '2.7' }} run: > pytest @@ -68,7 +68,7 @@ jobs: env: PYTHONDEVMODE: yes - - name: Run Pytest for python 3 and get code coverage for Codecov + - name: Run Pytest for python 3 and get code coverage if: ${{ matrix.python-version != '2.7' }} run: > pytest @@ -80,16 +80,13 @@ jobs: env: PYTHONDEVMODE: yes - - name: Upload Python ${{matrix.python-version}} coverage report to Codecov - uses: codecov/codecov-action@v3 + - name: Upload coverage report to Coveralls + uses: coverallsapp/github-action@v2 with: - directory: .git - files: coverage${{matrix.python-version}}.xml - env_vars: OS,PYTHON - fail_ci_if_error: false - flags: python${{matrix.python-version}} - name: coverage${{matrix.python-version}} - verbose: true + format: cobertura + files: .git/coverage${{matrix.python-version}}.xml + flag-name: python${{matrix.python-version}} + parallel: true - uses: dciborow/action-pylint@0.1.0 if: ${{ matrix.python-version != '2.7' }} @@ -114,6 +111,20 @@ jobs: github_token: ${{ secrets.github_token }} continue-on-error: true + # For coverage of 2.7 and 3.11 we upload to Coveralls in parallel mode. + # To view the Coveralls results of the PR, click on the "Details" link to the right + # of the Coveralls Logo in the Checks section of the PR. + finish-parallel-coveralls-upload: + name: Finish coverage upload + needs: python-test # run after the python-test has completed uploading coverages + runs-on: ubuntu-latest + steps: + - name: Finish the parallel coverage upload to Coveralls + uses: coverallsapp/github-action@v2 + with: + parallel-finished: true + continue-on-error: true # Do not fail CI if this step fails + deprecation-test: name: Deprecation tests runs-on: ubuntu-22.04 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1c3dca70fcd..9a051ef15f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,6 +46,12 @@ jobs: runs-on: ubuntu-latest needs: [build-python, build-sdks] steps: + - name: Retrieve Go SDK distribution artifacts + uses: actions/download-artifact@v4 + with: + name: SDK_Artifacts_Go + path: sdk_go/ + - name: Retrieve Python SDK distribution artifacts uses: actions/download-artifact@v4 with: @@ -93,12 +99,17 @@ jobs: shell: bash run: zip PowerShell-SDK-7.x-prerelease-unsigned.zip ./sdk_powershell_7x -r + - name: Zip Go SDK artifacts for deployment + shell: bash + run: zip Go-SDK-prerelease-unsigned.zip ./sdk_go -r + - name: Create release ${{ github.ref_name }} shell: bash run: | gh release create ${{ github.ref_name }} --repo ${{ github.repository }} --generate-notes dist/* \ PowerShell-SDK-5.x-prerelease-unsigned.zip \ PowerShell-SDK-7.x-prerelease-unsigned.zip \ + Go-SDK-prerelease-unsigned.zip \ libxenserver-prerelease.tar.gz libxenserver-prerelease.src.tar.gz env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Makefile b/Makefile index 20ae94e75b6..efa6394047f 100644 --- a/Makefile +++ b/Makefile @@ -265,7 +265,7 @@ install: build doc sdk doc-json message-switch message-switch-async message-switch-cli message-switch-core message-switch-lwt \ message-switch-unix xapi-idl forkexec xapi-forkexecd xapi-storage xapi-storage-script xapi-storage-cli \ xapi-nbd varstored-guard xapi-log xapi-open-uri xapi-tracing xapi-tracing-export xapi-expiry-alerts cohttp-posix \ - xapi-rrd xapi-inventory \ + xapi-rrd xapi-inventory clock \ xapi-stdext-date xapi-stdext-encodings xapi-stdext-pervasives xapi-stdext-std xapi-stdext-threads xapi-stdext-unix xapi-stdext-zerocheck # docs mkdir -p $(DESTDIR)$(DOCDIR) @@ -287,7 +287,7 @@ uninstall: message-switch message-switch-async message-switch-cli message-switch-core message-switch-lwt \ message-switch-unix xapi-idl forkexec xapi-forkexecd xapi-storage xapi-storage-script xapi-log \ xapi-open-uri xapi-tracing xapi-tracing-export xapi-expiry-alerts cohttp-posix \ - xapi-rrd xapi-inventory \ + xapi-rrd xapi-inventory clock \ xapi-stdext-date xapi-stdext-encodings xapi-stdext-pervasives xapi-stdext-std xapi-stdext-threads xapi-stdext-unix xapi-stdext-zerocheck compile_flags.txt: Makefile diff --git a/clock.opam b/clock.opam new file mode 100644 index 00000000000..44c24235c58 --- /dev/null +++ b/clock.opam @@ -0,0 +1,32 @@ +# This file is generated by dune, edit dune-project instead +opam-version: "2.0" +synopsis: "Xapi's library for managing time" +maintainer: ["Xapi project maintainers"] +authors: ["Jonathan Ludlam" "Pau Ruiz Safont"] +license: "LGPL-2.1-only WITH OCaml-LGPL-linking-exception" +homepage: "https://xapi-project.github.io/" +bug-reports: "https://github.com/xapi-project/xen-api/issues" +depends: [ + "dune" {>= "3.0"} + "ocaml" {>= "4.12"} + "alcotest" {with-test} + "astring" + "mtime" + "ptime" + "odoc" {with-doc} +] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/xapi-project/xen-api.git" diff --git a/doc/content/xen-api/classes/_index.html b/doc/content/xen-api/classes/_index.html index d466e62368c..01a5748de6f 100644 --- a/doc/content/xen-api/classes/_index.html +++ b/doc/content/xen-api/classes/_index.html @@ -2,6 +2,7 @@ title = "XenAPI Reference" layout = "class" type = "xenapi" +weight = 100 +++
diff --git a/doc/content/xen-api/releases/1.250.0.md b/doc/content/xen-api/releases/1.250.0.md new file mode 100644 index 00000000000..82dd803d464 --- /dev/null +++ b/doc/content/xen-api/releases/1.250.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.250.0" +layout = "release" +type = "xenapi" +release = "1.250.0" +weight = 38 ++++ diff --git a/doc/content/xen-api/releases/1.257.0.md b/doc/content/xen-api/releases/1.257.0.md new file mode 100644 index 00000000000..dbc387522b1 --- /dev/null +++ b/doc/content/xen-api/releases/1.257.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.257.0" +layout = "release" +type = "xenapi" +release = "1.257.0" +weight = 37 ++++ diff --git a/doc/content/xen-api/releases/1.271.0.md b/doc/content/xen-api/releases/1.271.0.md new file mode 100644 index 00000000000..a315596be00 --- /dev/null +++ b/doc/content/xen-api/releases/1.271.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.271.0" +layout = "release" +type = "xenapi" +release = "1.271.0" +weight = 36 ++++ diff --git a/doc/content/xen-api/releases/1.290.0.md b/doc/content/xen-api/releases/1.290.0.md new file mode 100644 index 00000000000..b013eba0625 --- /dev/null +++ b/doc/content/xen-api/releases/1.290.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.290.0" +layout = "release" +type = "xenapi" +release = "1.290.0" +weight = 35 ++++ diff --git a/doc/content/xen-api/releases/1.294.0.md b/doc/content/xen-api/releases/1.294.0.md new file mode 100644 index 00000000000..28b7eb16705 --- /dev/null +++ b/doc/content/xen-api/releases/1.294.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.294.0" +layout = "release" +type = "xenapi" +release = "1.294.0" +weight = 34 ++++ diff --git a/doc/content/xen-api/releases/1.297.0.md b/doc/content/xen-api/releases/1.297.0.md new file mode 100644 index 00000000000..5722a2e10ef --- /dev/null +++ b/doc/content/xen-api/releases/1.297.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.297.0" +layout = "release" +type = "xenapi" +release = "1.297.0" +weight = 33 ++++ diff --git a/doc/content/xen-api/releases/1.298.0.md b/doc/content/xen-api/releases/1.298.0.md new file mode 100644 index 00000000000..230a6832557 --- /dev/null +++ b/doc/content/xen-api/releases/1.298.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.298.0" +layout = "release" +type = "xenapi" +release = "1.298.0" +weight = 32 ++++ diff --git a/doc/content/xen-api/releases/1.301.0.md b/doc/content/xen-api/releases/1.301.0.md new file mode 100644 index 00000000000..1b6f714bc05 --- /dev/null +++ b/doc/content/xen-api/releases/1.301.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.301.0" +layout = "release" +type = "xenapi" +release = "1.301.0" +weight = 31 ++++ diff --git a/doc/content/xen-api/releases/1.303.0.md b/doc/content/xen-api/releases/1.303.0.md new file mode 100644 index 00000000000..62d65595ddb --- /dev/null +++ b/doc/content/xen-api/releases/1.303.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.303.0" +layout = "release" +type = "xenapi" +release = "1.303.0" +weight = 30 ++++ diff --git a/doc/content/xen-api/releases/1.304.0.md b/doc/content/xen-api/releases/1.304.0.md new file mode 100644 index 00000000000..19bc602d1af --- /dev/null +++ b/doc/content/xen-api/releases/1.304.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.304.0" +layout = "release" +type = "xenapi" +release = "1.304.0" +weight = 29 ++++ diff --git a/doc/content/xen-api/releases/1.307.0.md b/doc/content/xen-api/releases/1.307.0.md new file mode 100644 index 00000000000..ae89b065da1 --- /dev/null +++ b/doc/content/xen-api/releases/1.307.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.307.0" +layout = "release" +type = "xenapi" +release = "1.307.0" +weight = 28 ++++ diff --git a/doc/content/xen-api/releases/1.313.0.md b/doc/content/xen-api/releases/1.313.0.md new file mode 100644 index 00000000000..3a0cd73b6bc --- /dev/null +++ b/doc/content/xen-api/releases/1.313.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.313.0" +layout = "release" +type = "xenapi" +release = "1.313.0" +weight = 27 ++++ diff --git a/doc/content/xen-api/releases/1.318.0.md b/doc/content/xen-api/releases/1.318.0.md new file mode 100644 index 00000000000..4661e86a0f8 --- /dev/null +++ b/doc/content/xen-api/releases/1.318.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.318.0" +layout = "release" +type = "xenapi" +release = "1.318.0" +weight = 26 ++++ diff --git a/doc/content/xen-api/releases/1.329.0.md b/doc/content/xen-api/releases/1.329.0.md new file mode 100644 index 00000000000..501551c8692 --- /dev/null +++ b/doc/content/xen-api/releases/1.329.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 1.329.0" +layout = "release" +type = "xenapi" +release = "1.329.0" +weight = 25 ++++ diff --git a/doc/content/xen-api/releases/21.2.0.md b/doc/content/xen-api/releases/21.2.0.md new file mode 100644 index 00000000000..7346972ca00 --- /dev/null +++ b/doc/content/xen-api/releases/21.2.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 21.2.0" +layout = "release" +type = "xenapi" +release = "21.2.0" +weight = 24 ++++ diff --git a/doc/content/xen-api/releases/21.3.0.md b/doc/content/xen-api/releases/21.3.0.md new file mode 100644 index 00000000000..041df4bea38 --- /dev/null +++ b/doc/content/xen-api/releases/21.3.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 21.3.0" +layout = "release" +type = "xenapi" +release = "21.3.0" +weight = 23 ++++ diff --git a/doc/content/xen-api/releases/21.4.0.md b/doc/content/xen-api/releases/21.4.0.md new file mode 100644 index 00000000000..f16971c9283 --- /dev/null +++ b/doc/content/xen-api/releases/21.4.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 21.4.0" +layout = "release" +type = "xenapi" +release = "21.4.0" +weight = 22 ++++ diff --git a/doc/content/xen-api/releases/22.12.0.md b/doc/content/xen-api/releases/22.12.0.md new file mode 100644 index 00000000000..be20881b901 --- /dev/null +++ b/doc/content/xen-api/releases/22.12.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.12.0" +layout = "release" +type = "xenapi" +release = "22.12.0" +weight = 20 ++++ diff --git a/doc/content/xen-api/releases/22.16.0.md b/doc/content/xen-api/releases/22.16.0.md new file mode 100644 index 00000000000..8d0c5c0f0d5 --- /dev/null +++ b/doc/content/xen-api/releases/22.16.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.16.0" +layout = "release" +type = "xenapi" +release = "22.16.0" +weight = 19 ++++ diff --git a/doc/content/xen-api/releases/22.19.0.md b/doc/content/xen-api/releases/22.19.0.md new file mode 100644 index 00000000000..024ab29aced --- /dev/null +++ b/doc/content/xen-api/releases/22.19.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.19.0" +layout = "release" +type = "xenapi" +release = "22.19.0" +weight = 18 ++++ diff --git a/doc/content/xen-api/releases/22.20.0.md b/doc/content/xen-api/releases/22.20.0.md new file mode 100644 index 00000000000..3e7c63b0e0b --- /dev/null +++ b/doc/content/xen-api/releases/22.20.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.20.0" +layout = "release" +type = "xenapi" +release = "22.20.0" +weight = 17 ++++ diff --git a/doc/content/xen-api/releases/22.26.0.md b/doc/content/xen-api/releases/22.26.0.md new file mode 100644 index 00000000000..cbc29030ef6 --- /dev/null +++ b/doc/content/xen-api/releases/22.26.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.26.0" +layout = "release" +type = "xenapi" +release = "22.26.0" +weight = 16 ++++ diff --git a/doc/content/xen-api/releases/22.27.0.md b/doc/content/xen-api/releases/22.27.0.md new file mode 100644 index 00000000000..dd9ef24ace7 --- /dev/null +++ b/doc/content/xen-api/releases/22.27.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.27.0" +layout = "release" +type = "xenapi" +release = "22.27.0" +weight = 15 ++++ diff --git a/doc/content/xen-api/releases/22.33.0.md b/doc/content/xen-api/releases/22.33.0.md new file mode 100644 index 00000000000..34c8533210a --- /dev/null +++ b/doc/content/xen-api/releases/22.33.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.33.0" +layout = "release" +type = "xenapi" +release = "22.33.0" +weight = 14 ++++ diff --git a/doc/content/xen-api/releases/22.37.0.md b/doc/content/xen-api/releases/22.37.0.md new file mode 100644 index 00000000000..9cebac8ab21 --- /dev/null +++ b/doc/content/xen-api/releases/22.37.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.37.0" +layout = "release" +type = "xenapi" +release = "22.37.0" +weight = 13 ++++ diff --git a/doc/content/xen-api/releases/22.5.0.md b/doc/content/xen-api/releases/22.5.0.md new file mode 100644 index 00000000000..1103d45c800 --- /dev/null +++ b/doc/content/xen-api/releases/22.5.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 22.5.0" +layout = "release" +type = "xenapi" +release = "22.5.0" +weight = 21 ++++ diff --git a/doc/content/xen-api/releases/23.1.0.md b/doc/content/xen-api/releases/23.1.0.md new file mode 100644 index 00000000000..8f100cb1cd5 --- /dev/null +++ b/doc/content/xen-api/releases/23.1.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 23.1.0" +layout = "release" +type = "xenapi" +release = "23.1.0" +weight = 12 ++++ diff --git a/doc/content/xen-api/releases/23.14.0.md b/doc/content/xen-api/releases/23.14.0.md new file mode 100644 index 00000000000..c812f55d41f --- /dev/null +++ b/doc/content/xen-api/releases/23.14.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 23.14.0" +layout = "release" +type = "xenapi" +release = "23.14.0" +weight = 10 ++++ diff --git a/doc/content/xen-api/releases/23.18.0.md b/doc/content/xen-api/releases/23.18.0.md new file mode 100644 index 00000000000..0aa6ec85d11 --- /dev/null +++ b/doc/content/xen-api/releases/23.18.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 23.18.0" +layout = "release" +type = "xenapi" +release = "23.18.0" +weight = 9 ++++ diff --git a/doc/content/xen-api/releases/23.25.0.md b/doc/content/xen-api/releases/23.25.0.md new file mode 100644 index 00000000000..4b5eeb7ff5d --- /dev/null +++ b/doc/content/xen-api/releases/23.25.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 23.25.0" +layout = "release" +type = "xenapi" +release = "23.25.0" +weight = 8 ++++ diff --git a/doc/content/xen-api/releases/23.27.0.md b/doc/content/xen-api/releases/23.27.0.md new file mode 100644 index 00000000000..196d2899e52 --- /dev/null +++ b/doc/content/xen-api/releases/23.27.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 23.27.0" +layout = "release" +type = "xenapi" +release = "23.27.0" +weight = 7 ++++ diff --git a/doc/content/xen-api/releases/23.30.0.md b/doc/content/xen-api/releases/23.30.0.md new file mode 100644 index 00000000000..350058f958f --- /dev/null +++ b/doc/content/xen-api/releases/23.30.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 23.30.0" +layout = "release" +type = "xenapi" +release = "23.30.0" +weight = 6 ++++ diff --git a/doc/content/xen-api/releases/23.9.0.md b/doc/content/xen-api/releases/23.9.0.md new file mode 100644 index 00000000000..db1bb6bdd49 --- /dev/null +++ b/doc/content/xen-api/releases/23.9.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 23.9.0" +layout = "release" +type = "xenapi" +release = "23.9.0" +weight = 11 ++++ diff --git a/doc/content/xen-api/releases/24.0.0.md b/doc/content/xen-api/releases/24.0.0.md new file mode 100644 index 00000000000..8f754b4f3ff --- /dev/null +++ b/doc/content/xen-api/releases/24.0.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 24.0.0" +layout = "release" +type = "xenapi" +release = "24.0.0" +weight = 5 ++++ diff --git a/doc/content/xen-api/releases/24.10.0.md b/doc/content/xen-api/releases/24.10.0.md new file mode 100644 index 00000000000..0f3eb490311 --- /dev/null +++ b/doc/content/xen-api/releases/24.10.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 24.10.0" +layout = "release" +type = "xenapi" +release = "24.10.0" +weight = 3 ++++ diff --git a/doc/content/xen-api/releases/24.14.0.md b/doc/content/xen-api/releases/24.14.0.md new file mode 100644 index 00000000000..858f8119365 --- /dev/null +++ b/doc/content/xen-api/releases/24.14.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 24.14.0" +layout = "release" +type = "xenapi" +release = "24.14.0" +weight = 2 ++++ diff --git a/doc/content/xen-api/releases/24.16.0.md b/doc/content/xen-api/releases/24.16.0.md new file mode 100644 index 00000000000..0852870afb2 --- /dev/null +++ b/doc/content/xen-api/releases/24.16.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 24.16.0" +layout = "release" +type = "xenapi" +release = "24.16.0" +weight = 1 ++++ diff --git a/doc/content/xen-api/releases/24.3.0.md b/doc/content/xen-api/releases/24.3.0.md new file mode 100644 index 00000000000..8b94dae5839 --- /dev/null +++ b/doc/content/xen-api/releases/24.3.0.md @@ -0,0 +1,7 @@ ++++ +title = "XAPI 24.3.0" +layout = "release" +type = "xenapi" +release = "24.3.0" +weight = 4 ++++ diff --git a/doc/content/xen-api/releases/_index.md b/doc/content/xen-api/releases/_index.md new file mode 100644 index 00000000000..ca69787c3b5 --- /dev/null +++ b/doc/content/xen-api/releases/_index.md @@ -0,0 +1,6 @@ ++++ +title = "XenAPI Releases" +weight = 150 ++++ + +{{% children %}} \ No newline at end of file diff --git a/doc/content/xen-api/releases/boston.md b/doc/content/xen-api/releases/boston.md new file mode 100644 index 00000000000..a9c7f3ec670 --- /dev/null +++ b/doc/content/xen-api/releases/boston.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.0" +layout = "release" +type = "xenapi" +release = "boston" +weight = 60 ++++ diff --git a/doc/content/xen-api/releases/clearwater-felton.md b/doc/content/xen-api/releases/clearwater-felton.md new file mode 100644 index 00000000000..5b96cf5bc23 --- /dev/null +++ b/doc/content/xen-api/releases/clearwater-felton.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.2 SP1 Hotfix 4" +layout = "release" +type = "xenapi" +release = "clearwater-felton" +weight = 55 ++++ diff --git a/doc/content/xen-api/releases/clearwater-whetstone.md b/doc/content/xen-api/releases/clearwater-whetstone.md new file mode 100644 index 00000000000..7c08accf364 --- /dev/null +++ b/doc/content/xen-api/releases/clearwater-whetstone.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.2 SP1 Hotfix 11" +layout = "release" +type = "xenapi" +release = "clearwater-whetstone" +weight = 54 ++++ diff --git a/doc/content/xen-api/releases/clearwater.md b/doc/content/xen-api/releases/clearwater.md new file mode 100644 index 00000000000..8c27b5c340e --- /dev/null +++ b/doc/content/xen-api/releases/clearwater.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.2" +layout = "release" +type = "xenapi" +release = "clearwater" +weight = 58 ++++ diff --git a/doc/content/xen-api/releases/cowley.md b/doc/content/xen-api/releases/cowley.md new file mode 100644 index 00000000000..29f45a0eddc --- /dev/null +++ b/doc/content/xen-api/releases/cowley.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 5.6 FP1" +layout = "release" +type = "xenapi" +release = "cowley" +weight = 61 ++++ diff --git a/doc/content/xen-api/releases/cream.md b/doc/content/xen-api/releases/cream.md new file mode 100644 index 00000000000..7f47c267f76 --- /dev/null +++ b/doc/content/xen-api/releases/cream.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.5 SP1" +layout = "release" +type = "xenapi" +release = "cream" +weight = 52 ++++ diff --git a/doc/content/xen-api/releases/creedence.md b/doc/content/xen-api/releases/creedence.md new file mode 100644 index 00000000000..f0402dd697d --- /dev/null +++ b/doc/content/xen-api/releases/creedence.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.5" +layout = "release" +type = "xenapi" +release = "creedence" +weight = 53 ++++ diff --git a/doc/content/xen-api/releases/dundee.md b/doc/content/xen-api/releases/dundee.md new file mode 100644 index 00000000000..ce1fd600279 --- /dev/null +++ b/doc/content/xen-api/releases/dundee.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 7.0" +layout = "release" +type = "xenapi" +release = "dundee" +weight = 50 ++++ diff --git a/doc/content/xen-api/releases/ely.md b/doc/content/xen-api/releases/ely.md new file mode 100644 index 00000000000..1371431e18f --- /dev/null +++ b/doc/content/xen-api/releases/ely.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 7.1" +layout = "release" +type = "xenapi" +release = "ely" +weight = 49 ++++ diff --git a/doc/content/xen-api/releases/falcon.md b/doc/content/xen-api/releases/falcon.md new file mode 100644 index 00000000000..15ecde78810 --- /dev/null +++ b/doc/content/xen-api/releases/falcon.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 7.2" +layout = "release" +type = "xenapi" +release = "falcon" +weight = 48 ++++ diff --git a/doc/content/xen-api/releases/george.md b/doc/content/xen-api/releases/george.md new file mode 100644 index 00000000000..ef79369c327 --- /dev/null +++ b/doc/content/xen-api/releases/george.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 5.5" +layout = "release" +type = "xenapi" +release = "george" +weight = 63 ++++ diff --git a/doc/content/xen-api/releases/indigo.md b/doc/content/xen-api/releases/indigo.md new file mode 100644 index 00000000000..cdb8b9cecf6 --- /dev/null +++ b/doc/content/xen-api/releases/indigo.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.5 SP1 Hotfix 31" +layout = "release" +type = "xenapi" +release = "indigo" +weight = 51 ++++ diff --git a/doc/content/xen-api/releases/inverness.md b/doc/content/xen-api/releases/inverness.md new file mode 100644 index 00000000000..85560d9b161 --- /dev/null +++ b/doc/content/xen-api/releases/inverness.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 7.3" +layout = "release" +type = "xenapi" +release = "inverness" +weight = 47 ++++ diff --git a/doc/content/xen-api/releases/jura.md b/doc/content/xen-api/releases/jura.md new file mode 100644 index 00000000000..751b36460de --- /dev/null +++ b/doc/content/xen-api/releases/jura.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 7.4" +layout = "release" +type = "xenapi" +release = "jura" +weight = 46 ++++ diff --git a/doc/content/xen-api/releases/kolkata.md b/doc/content/xen-api/releases/kolkata.md new file mode 100644 index 00000000000..624757ac680 --- /dev/null +++ b/doc/content/xen-api/releases/kolkata.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 7.5" +layout = "release" +type = "xenapi" +release = "kolkata" +weight = 45 ++++ diff --git a/doc/content/xen-api/releases/lima.md b/doc/content/xen-api/releases/lima.md new file mode 100644 index 00000000000..f95d0af2877 --- /dev/null +++ b/doc/content/xen-api/releases/lima.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 7.6" +layout = "release" +type = "xenapi" +release = "lima" +weight = 44 ++++ diff --git a/doc/content/xen-api/releases/miami.md b/doc/content/xen-api/releases/miami.md new file mode 100644 index 00000000000..5ca0dc1e236 --- /dev/null +++ b/doc/content/xen-api/releases/miami.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 4.1" +layout = "release" +type = "xenapi" +release = "miami" +weight = 67 ++++ diff --git a/doc/content/xen-api/releases/midnight-ride.md b/doc/content/xen-api/releases/midnight-ride.md new file mode 100644 index 00000000000..9a8dca612e5 --- /dev/null +++ b/doc/content/xen-api/releases/midnight-ride.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 5.6" +layout = "release" +type = "xenapi" +release = "midnight-ride" +weight = 62 ++++ diff --git a/doc/content/xen-api/releases/naples.md b/doc/content/xen-api/releases/naples.md new file mode 100644 index 00000000000..6c5bdfd30d3 --- /dev/null +++ b/doc/content/xen-api/releases/naples.md @@ -0,0 +1,7 @@ ++++ +title = "Citrix Hypervisor 8.0" +layout = "release" +type = "xenapi" +release = "naples" +weight = 43 ++++ diff --git a/doc/content/xen-api/releases/nile-preview.md b/doc/content/xen-api/releases/nile-preview.md new file mode 100644 index 00000000000..9b7eee9e675 --- /dev/null +++ b/doc/content/xen-api/releases/nile-preview.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 8 Preview" +layout = "release" +type = "xenapi" +release = "nile-preview" +weight = 39 ++++ diff --git a/doc/content/xen-api/releases/orlando-update-1.md b/doc/content/xen-api/releases/orlando-update-1.md new file mode 100644 index 00000000000..2bcd4892b6d --- /dev/null +++ b/doc/content/xen-api/releases/orlando-update-1.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 5.0 Update 1" +layout = "release" +type = "xenapi" +release = "orlando-update-1" +weight = 64 ++++ diff --git a/doc/content/xen-api/releases/orlando.md b/doc/content/xen-api/releases/orlando.md new file mode 100644 index 00000000000..6d348d7d1ce --- /dev/null +++ b/doc/content/xen-api/releases/orlando.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 5.0" +layout = "release" +type = "xenapi" +release = "orlando" +weight = 65 ++++ diff --git a/doc/content/xen-api/releases/quebec.md b/doc/content/xen-api/releases/quebec.md new file mode 100644 index 00000000000..72e56f85156 --- /dev/null +++ b/doc/content/xen-api/releases/quebec.md @@ -0,0 +1,7 @@ ++++ +title = "Citrix Hypervisor 8.1" +layout = "release" +type = "xenapi" +release = "quebec" +weight = 42 ++++ diff --git a/doc/content/xen-api/releases/rio.md b/doc/content/xen-api/releases/rio.md new file mode 100644 index 00000000000..2ab3a3c295e --- /dev/null +++ b/doc/content/xen-api/releases/rio.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 4.0" +layout = "release" +type = "xenapi" +release = "rio" +weight = 68 ++++ diff --git a/doc/content/xen-api/releases/stockholm.md b/doc/content/xen-api/releases/stockholm.md new file mode 100644 index 00000000000..18a52ec9c8a --- /dev/null +++ b/doc/content/xen-api/releases/stockholm.md @@ -0,0 +1,7 @@ ++++ +title = "Citrix Hypervisor 8.2" +layout = "release" +type = "xenapi" +release = "stockholm" +weight = 41 ++++ diff --git a/doc/content/xen-api/releases/stockholm_psr.md b/doc/content/xen-api/releases/stockholm_psr.md new file mode 100644 index 00000000000..17000a4c899 --- /dev/null +++ b/doc/content/xen-api/releases/stockholm_psr.md @@ -0,0 +1,7 @@ ++++ +title = "Citrix Hypervisor 8.2 Hotfix 2" +layout = "release" +type = "xenapi" +release = "stockholm_psr" +weight = 40 ++++ diff --git a/doc/content/xen-api/releases/symc.md b/doc/content/xen-api/releases/symc.md new file mode 100644 index 00000000000..9d1d20e7314 --- /dev/null +++ b/doc/content/xen-api/releases/symc.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 4.1.1" +layout = "release" +type = "xenapi" +release = "symc" +weight = 66 ++++ diff --git a/doc/content/xen-api/releases/tampa.md b/doc/content/xen-api/releases/tampa.md new file mode 100644 index 00000000000..b4182ff588b --- /dev/null +++ b/doc/content/xen-api/releases/tampa.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.1" +layout = "release" +type = "xenapi" +release = "tampa" +weight = 59 ++++ diff --git a/doc/content/xen-api/releases/vgpu-productisation.md b/doc/content/xen-api/releases/vgpu-productisation.md new file mode 100644 index 00000000000..76153a84ded --- /dev/null +++ b/doc/content/xen-api/releases/vgpu-productisation.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.2 SP1" +layout = "release" +type = "xenapi" +release = "vgpu-productisation" +weight = 56 ++++ diff --git a/doc/content/xen-api/releases/vgpu-tech-preview.md b/doc/content/xen-api/releases/vgpu-tech-preview.md new file mode 100644 index 00000000000..e3d7dd13b32 --- /dev/null +++ b/doc/content/xen-api/releases/vgpu-tech-preview.md @@ -0,0 +1,7 @@ ++++ +title = "XenServer 6.2 SP1 Tech-Preview" +layout = "release" +type = "xenapi" +release = "vgpu-tech-preview" +weight = 57 ++++ diff --git a/doc/content/xen-api/topics/_index.md b/doc/content/xen-api/topics/_index.md new file mode 100644 index 00000000000..397bcf171a4 --- /dev/null +++ b/doc/content/xen-api/topics/_index.md @@ -0,0 +1,6 @@ ++++ +title = "Topics" +weight = 200 ++++ + +{{% children %}} diff --git a/doc/content/xen-api/topics/consoles.md b/doc/content/xen-api/topics/consoles.md new file mode 100644 index 00000000000..e478791320e --- /dev/null +++ b/doc/content/xen-api/topics/consoles.md @@ -0,0 +1,96 @@ +--- +title: VM consoles +layout: default +--- + +Most XenAPI graphical interfaces will want to gain access to the VM consoles, in order to render them to the user as if they were physical machines. There are several types of consoles available, depending on the type of guest or if the physical host console is being accessed: + +Types of consoles +================= + +|Operating System|Text|Graphical|Optimized graphical| +|:---------------|:---|:--------|:------------------| +|Windows|No|VNC, using an API call|RDP, directly from guest| +|Linux|Yes, through VNC and an API call|No|VNC, directly from guest| +|Physical Host|Yes, through VNC and an API call|No|No| + +Hardware-assisted VMs, such as Windows, directly provide a graphical console over VNC. There is no text-based console, and guest networking is not necessary to use the graphical console. Once guest networking has been established, it is more efficient to setup Remote Desktop Access and use an RDP client to connect directly (this must be done outside of the XenAPI). + +Paravirtual VMs, such as Linux guests, provide a native text console directly. XenServer provides a utility (called `vncterm`) to convert this text-based console into a graphical VNC representation. Guest networking is not necessary for this console to function. As with Windows above, Linux distributions often configure VNC within the guest, and directly connect to it over a guest network interface. + +The physical host console is only available as a `vt100` console, which is exposed through the XenAPI as a VNC console by using `vncterm` in the control domain. + +RFB (Remote Framebuffer) is the protocol which underlies VNC, specified in [The RFB Protocol](http://www.realvnc.com/docs/rfbproto.pdf). Third-party developers are expected to provide their own VNC viewers, and many freely available implementations can be adapted for this purpose. RFB 3.3 is the minimum version which viewers must support. + +Retrieving VNC consoles using the API +===================================== + +VNC consoles are retrieved using a special URL passed through to the host agent. The sequence of API calls is as follows: + +1. Client to Master/443: XML-RPC: `Session.login_with_password()`. + +2. Master/443 to Client: Returns a session reference to be used with subsequent calls. + +3. Client to Master/443: XML-RPC: `VM.get_by_name_label()`. + +4. Master/443 to Client: Returns a reference to a particular VM (or the "control domain" if you want to retrieve the physical host console). + +5. Client to Master/443: XML-RPC: `VM.get_consoles()`. + +6. Master/443 to Client: Returns a list of console objects associated with the VM. + +7. Client to Master/443: XML-RPC: `VM.get_location()`. + +8. Returns a URI describing where the requested console is located. The URIs are of the form: `https://192.168.0.1/console?ref=OpaqueRef:c038533a-af99-a0ff-9095-c1159f2dc6a0`. + +9. Client to 192.168.0.1: HTTP CONNECT "/console?ref=(...)" + +The final HTTP CONNECT is slightly non-standard since the HTTP/1.1 RFC specifies that it should only be a host and a port, rather than a URL. Once the HTTP connect is complete, the connection can subsequently directly be used as a VNC server without any further HTTP protocol action. + +This scheme requires direct access from the client to the control domain's IP, and will not work correctly if there are Network Address Translation (NAT) devices blocking such connectivity. You can use the CLI to retrieve the console URI from the client and perform a connectivity check. + +Retrieve the VM UUID by running: + +```sh +$ VM=$(xe vm-list params=uuid --minimal name-label=) +``` + +Retrieve the console information: + +```sh +$ xe console-list vm-uuid=$VM +uuid ( RO) : 8013b937-ff7e-60d1-ecd8-e52d66c5879e + vm-uuid ( RO): 2d7c558a-8f03-b1d0-e813-cbe7adfa534c + vm-name-label ( RO): 6 + protocol ( RO): RFB + location ( RO): https://10.80.228.30/console?uuid=8013b937-ff7e-60d1-ecd8-e52d66c5879e +``` + +Use command-line utilities like `ping` to test connectivity to the IP address provided in the `location` field. + +Disabling VNC forwarding for Linux VM +===================================== + +When creating and destroying Linux VMs, the host agent automatically manages the `vncterm` processes which convert the text console into VNC. Advanced users who wish to directly access the text console can disable VNC forwarding for that VM. The text console can then only be accessed directly from the control domain directly, and graphical interfaces such as XenCenter will not be able to render a console for that VM. + +Before starting the guest, set the following parameter on the VM record: + +```sh +$ xe vm-param-set uuid=$VM other-config:disable_pv_vnc=1 +``` + +Start the VM. + +Use the CLI to retrieve the underlying domain ID of the VM with: + +```sh +$ DOMID=$(xe vm-list params=dom-id uuid=$VM --minimal) +``` + +On the host console, connect to the text console directly by: + +```sh +$ /usr/lib/xen/bin/xenconsole $DOMID +``` + +This configuration is an advanced procedure, and we do not recommend that the text console is directly used for heavy I/O operations. Instead, connect to the guest over SSH or some other network-based connection mechanism. diff --git a/doc/content/xen-api/topics/guest-agents.md b/doc/content/xen-api/topics/guest-agents.md new file mode 100644 index 00000000000..0a745db3478 --- /dev/null +++ b/doc/content/xen-api/topics/guest-agents.md @@ -0,0 +1,26 @@ +--- +title: Guest agents +layout: default +--- + +"Guest agents" are special programs which run inside VMs which can be controlled +via the XenAPI. + +One communication method between XenAPI clients is via Xenstore. + +Adding Xenstore entries to VMs +------------------------------ + +Developers may wish to install guest agents into VMs which take special action based on the type of the VM. In order to communicate this information into the guest, a special Xenstore name-space known as `vm-data` is available which is populated at VM creation time. It is populated from the `xenstore-data` map in the VM record. + +Set the `xenstore-data` parameter in the VM record: + + xe vm-param-set uuid= xenstore-data:vm-data/foo=bar + +Start the VM. + +If it is a Linux-based VM, install the COMPANY\_TOOLS and use the `xenstore-read` to verify that the node exists in Xenstore. + +> **Note** +> +> Only prefixes beginning with `vm-data` are permitted, and anything not in this name-space will be silently ignored when starting the VM. diff --git a/doc/content/xen-api/topics/importexport.md b/doc/content/xen-api/topics/importexport.md new file mode 100644 index 00000000000..e434c2ae3cd --- /dev/null +++ b/doc/content/xen-api/topics/importexport.md @@ -0,0 +1,212 @@ +--- +title: VM import/export +layout: default +--- + +VMs can be exported to a file and later imported to any Xapi host. The export +protocol is a simple HTTP(S) GET, which should be sent to the Pool master. +Authorization is either via a pre-created `session_id` or by HTTP basic +authentication (particularly useful on the command-line). +The VM to export is specified either by UUID or by reference. To keep track of +the export, a task can be created and passed in using its reference. Note that +Xapi may send an HTTP redirect if a different host has better access to the +disk data. + +The following arguments are passed as URI query parameters or HTTP cookies: + +Argument | Description +----------------|--------------------------------------------------------- +session_id | the reference of the session being used to authenticate; required only when not using HTTP basic authentication +task_id | the reference of the task object with which to keep track of the operation; optional, required only if you have created a task object to keep track of the export +ref | the reference of the VM; required only if not using the UUID +uuid | the UUID of the VM; required only if not using the reference +use_compression | an optional boolean "true" or "false" (defaulting to "false"). If "true" then the output will be gzip-compressed before transmission. + + +For example, using the Linux command line tool cURL: + +```sh +$ curl http://root:foo@myxenserver1/export?uuid= -o +``` + +will export the specified VM to the file `exportfile`. + +To export just the metadata, use the URI `http://server/export_metadata`. + +The import protocol is similar, using HTTP(S) PUT. The `session_id` and `task_id` arguments are as for the export. The `ref` and `uuid` are not used; a new reference and uuid will be generated for the VM. There are some additional parameters: + +Argument | Description +------------|--------------------------------------------------------- +restore | if `true`, the import is treated as replacing the original VM - the implication of this currently is that the MAC addresses on the VIFs are exactly as the export was, which will lead to conflicts if the original VM is still being run. +force | if `true`, any checksum failures will be ignored (the default is to destroy the VM if a checksum error is detected) +sr_id | the reference of an SR into which the VM should be imported. The default behavior is to import into the `Pool.default_SR` + +Note there is no need to specify whether the export is compressed, as Xapi +will automatically detect and decompress gzip-encoded streams. + +For example, again using cURL: + +```sh +curl -T http://root:foo@myxenserver2/import +``` + +will import the VM to the default SR on the server. + +> **Note** +> +> Note that if no default SR has been set, and no `sr_uuid` is specified, the error message `DEFAULT_SR_NOT_FOUND` is returned. + +Another example: + +```sh +curl -T http://root:foo@myxenserver2/import?sr_id= +``` + +will import the VM to the specified SR on the server. + +To import just the metadata, use the URI `http://server/import_metadata` + +Legacy VM Import Format +======================= + +This section describes the legacy VM import/export format and is for historical +interest only. It should be updated to describe the current format, see +[issue 64](https://github.com/xapi-project/xapi-project.github.io/issues/64) + + +Xapi supports a human-readable legacy VM input format called XVA. This section describes the syntax and structure of XVA. + +An XVA consists of a directory containing XML metadata and a set of disk images. A VM represented by an XVA is not intended to be directly executable. Data within an XVA package is compressed and intended for either archiving on permanent storage or for being transmitted to a VM server - such as a XenServer host - where it can be decompressed and executed. + +XVA is a hypervisor-neutral packaging format; it should be possible to create simple tools to instantiate an XVA VM on any other platform. XVA does not specify any particular runtime format; for example disks may be instantiated as file images, LVM volumes, QCoW images, VMDK or VHD images. An XVA VM may be instantiated any number of times, each instantiation may have a different runtime format. + +XVA does not: + +- specify any particular serialization or transport format + +- provide any mechanism for customizing VMs (or templates) on install + +- address how a VM may be upgraded post-install + +- define how multiple VMs, acting as an appliance, may communicate + +These issues are all addressed by the related Open Virtual Appliance specification. + +An XVA is a directory containing, at a minimum, a file called `ova.xml`. This file describes the VM contained within the XVA and is described in Section 3.2. Disks are stored within sub-directories and are referenced from the ova.xml. The format of disk data is described later in Section 3.3. + +The following terms will be used in the rest of the chapter: + +- HVM: a mode in which unmodified OS kernels run with the help of virtualization support in the hardware. + +- PV: a mode in which specially modified "paravirtualized" kernels run explicitly on top of a hypervisor without requiring hardware support for virtualization. + +The "ova.xml" file contains the following elements: + +```xml + +``` + +The number in the attribute "version" indicates the version of this specification to which the XVA is constructed; in this case version 0.1. Inside the \ there is exactly one \: (in the OVA specification, multiple \s are permitted) + +```xml + +``` + +Each `` element describes one VM. The "name" attribute is for future internal use only and must be unique within the ova.xml file. The "name" attribute is permitted to be any valid UTF-8 string. Inside each \ tag are the following compulsory elements: + +```xml + +``` + +A short name for the VM to be displayed in a UI. + +```xml + ... description ... +``` + +A description for the VM to be displayed in the UI. Note that for both `