From ebcb5676fefe580e6df94fe82e76b1e71dd74347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Mon, 18 Nov 2024 10:15:00 +0000 Subject: [PATCH 01/14] ci: refresh with 'lcitool manifest' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Notable changes * AlmaLinux 8 / CentOS Stream 8 replaced with 9 * Fedora 38 dropped, 40 added * Ubuntu 20.04 dropped, 24.04 added * Debian 11 dropped, 12 added Signed-off-by: Daniel P. Berrangé --- .../{almalinux-8.sh => almalinux-9.sh} | 7 +- ...{centos-stream-8.sh => centos-stream-9.sh} | 7 +- ci/buildenv/{debian-11.sh => debian-12.sh} | 0 ci/buildenv/fedora-39.sh | 2 +- ci/buildenv/{fedora-38.sh => fedora-40.sh} | 2 +- ci/buildenv/fedora-rawhide.sh | 2 +- ci/buildenv/opensuse-leap-15.sh | 3 +- ci/buildenv/ubuntu-2004.sh | 26 ------- ci/buildenv/ubuntu-2204.sh | 30 +------- ci/buildenv/ubuntu-2404.sh | 54 ++++++++++++++ ...ux-8.Dockerfile => almalinux-9.Dockerfile} | 9 +-- ....Dockerfile => centos-stream-9.Dockerfile} | 9 +-- ci/containers/debian-11.Dockerfile | 29 -------- ...u-2004.Dockerfile => debian-12.Dockerfile} | 2 +- ci/containers/fedora-39.Dockerfile | 2 +- ...ora-38.Dockerfile => fedora-40.Dockerfile} | 4 +- ci/containers/fedora-rawhide.Dockerfile | 2 +- ci/containers/opensuse-leap-15.Dockerfile | 5 +- ci/containers/ubuntu-2204.Dockerfile | 32 +-------- ci/containers/ubuntu-2404.Dockerfile | 57 +++++++++++++++ ci/gitlab.yml | 13 ++-- ci/gitlab/build-templates.yml | 16 +++-- ci/gitlab/builds.yml | 70 +++++++++---------- ci/gitlab/containers.yml | 32 ++++----- ci/gitlab/sanity-checks.yml | 8 ++- ci/manifest.yml | 20 +++--- 26 files changed, 233 insertions(+), 210 deletions(-) rename ci/buildenv/{almalinux-8.sh => almalinux-9.sh} (76%) rename ci/buildenv/{centos-stream-8.sh => centos-stream-9.sh} (77%) rename ci/buildenv/{debian-11.sh => debian-12.sh} (100%) rename ci/buildenv/{fedora-38.sh => fedora-40.sh} (92%) delete mode 100644 ci/buildenv/ubuntu-2004.sh create mode 100644 ci/buildenv/ubuntu-2404.sh rename ci/containers/{almalinux-8.Dockerfile => almalinux-9.Dockerfile} (72%) rename ci/containers/{centos-stream-8.Dockerfile => centos-stream-9.Dockerfile} (74%) delete mode 100644 ci/containers/debian-11.Dockerfile rename ci/containers/{ubuntu-2004.Dockerfile => debian-12.Dockerfile} (96%) rename ci/containers/{fedora-38.Dockerfile => fedora-40.Dockerfile} (90%) create mode 100644 ci/containers/ubuntu-2404.Dockerfile diff --git a/ci/buildenv/almalinux-8.sh b/ci/buildenv/almalinux-9.sh similarity index 76% rename from ci/buildenv/almalinux-8.sh rename to ci/buildenv/almalinux-9.sh index 4478e4f..f4065ad 100644 --- a/ci/buildenv/almalinux-8.sh +++ b/ci/buildenv/almalinux-9.sh @@ -7,16 +7,17 @@ function install_buildenv() { dnf update -y dnf install 'dnf-command(config-manager)' -y - dnf config-manager --set-enabled -y powertools - dnf install -y centos-release-advanced-virtualization + dnf config-manager --set-enabled -y crb dnf install -y epel-release dnf install -y \ ant \ + ant-junit \ ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ + junit \ libvirt-devel \ rpm-build rpm -qa | sort > /packages.txt diff --git a/ci/buildenv/centos-stream-8.sh b/ci/buildenv/centos-stream-9.sh similarity index 77% rename from ci/buildenv/centos-stream-8.sh rename to ci/buildenv/centos-stream-9.sh index a78bbc6..66904b2 100644 --- a/ci/buildenv/centos-stream-8.sh +++ b/ci/buildenv/centos-stream-9.sh @@ -7,17 +7,18 @@ function install_buildenv() { dnf distro-sync -y dnf install 'dnf-command(config-manager)' -y - dnf config-manager --set-enabled -y powertools - dnf install -y centos-release-advanced-virtualization + dnf config-manager --set-enabled -y crb dnf install -y epel-release dnf install -y epel-next-release dnf install -y \ ant \ + ant-junit \ ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ + junit \ libvirt-devel \ rpm-build rpm -qa | sort > /packages.txt diff --git a/ci/buildenv/debian-11.sh b/ci/buildenv/debian-12.sh similarity index 100% rename from ci/buildenv/debian-11.sh rename to ci/buildenv/debian-12.sh diff --git a/ci/buildenv/fedora-39.sh b/ci/buildenv/fedora-39.sh index 46b5102..70ab49a 100644 --- a/ci/buildenv/fedora-39.sh +++ b/ci/buildenv/fedora-39.sh @@ -12,7 +12,7 @@ function install_buildenv() { ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ junit \ libvirt-devel \ diff --git a/ci/buildenv/fedora-38.sh b/ci/buildenv/fedora-40.sh similarity index 92% rename from ci/buildenv/fedora-38.sh rename to ci/buildenv/fedora-40.sh index 46b5102..70ab49a 100644 --- a/ci/buildenv/fedora-38.sh +++ b/ci/buildenv/fedora-40.sh @@ -12,7 +12,7 @@ function install_buildenv() { ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ junit \ libvirt-devel \ diff --git a/ci/buildenv/fedora-rawhide.sh b/ci/buildenv/fedora-rawhide.sh index 1ba76e7..0e3c619 100644 --- a/ci/buildenv/fedora-rawhide.sh +++ b/ci/buildenv/fedora-rawhide.sh @@ -13,7 +13,7 @@ function install_buildenv() { ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ junit \ libvirt-devel \ diff --git a/ci/buildenv/opensuse-leap-15.sh b/ci/buildenv/opensuse-leap-15.sh index e0a14fb..9cfdf13 100644 --- a/ci/buildenv/opensuse-leap-15.sh +++ b/ci/buildenv/opensuse-leap-15.sh @@ -6,13 +6,14 @@ function install_buildenv() { zypper update -y + zypper addrepo -fc https://download.opensuse.org/update/leap/15.6/backports/openSUSE:Backports:SLE-15-SP6:Update.repo zypper install -y \ ant \ ant-junit \ ca-certificates \ git \ glibc-locale \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ junit \ libvirt-devel \ diff --git a/ci/buildenv/ubuntu-2004.sh b/ci/buildenv/ubuntu-2004.sh deleted file mode 100644 index d2f6a77..0000000 --- a/ci/buildenv/ubuntu-2004.sh +++ /dev/null @@ -1,26 +0,0 @@ -# THIS FILE WAS AUTO-GENERATED -# -# $ lcitool manifest ci/manifest.yml -# -# https://gitlab.com/libvirt/libvirt-ci - -function install_buildenv() { - export DEBIAN_FRONTEND=noninteractive - apt-get update - apt-get dist-upgrade -y - apt-get install --no-install-recommends -y \ - ant \ - ant-optional \ - ca-certificates \ - git \ - junit \ - libjna-java \ - libvirt-dev \ - locales \ - openjdk-17-jdk-headless - sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen - dpkg-reconfigure locales - dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt -} - -export LANG="en_US.UTF-8" diff --git a/ci/buildenv/ubuntu-2204.sh b/ci/buildenv/ubuntu-2204.sh index a022f83..d2f6a77 100644 --- a/ci/buildenv/ubuntu-2204.sh +++ b/ci/buildenv/ubuntu-2204.sh @@ -12,43 +12,15 @@ function install_buildenv() { ant \ ant-optional \ ca-certificates \ - ccache \ - cpp \ - gcc \ - gettext \ git \ junit \ - libc6-dev \ - libglib2.0-dev \ - libgnutls28-dev \ libjna-java \ - libnl-3-dev \ - libnl-route-3-dev \ - libtirpc-dev \ libvirt-dev \ - libxml2-dev \ - libxml2-utils \ locales \ - make \ - meson \ - ninja-build \ - openjdk-17-jdk-headless \ - perl-base \ - pkgconf \ - python3 \ - python3-docutils \ - xsltproc + openjdk-17-jdk-headless sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen dpkg-reconfigure locales - rm -f /usr/lib*/python3*/EXTERNALLY-MANAGED dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt - mkdir -p /usr/libexec/ccache-wrappers - ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc - ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc } -export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers" export LANG="en_US.UTF-8" -export MAKE="/usr/bin/make" -export NINJA="/usr/bin/ninja" -export PYTHON="/usr/bin/python3" diff --git a/ci/buildenv/ubuntu-2404.sh b/ci/buildenv/ubuntu-2404.sh new file mode 100644 index 0000000..a022f83 --- /dev/null +++ b/ci/buildenv/ubuntu-2404.sh @@ -0,0 +1,54 @@ +# THIS FILE WAS AUTO-GENERATED +# +# $ lcitool manifest ci/manifest.yml +# +# https://gitlab.com/libvirt/libvirt-ci + +function install_buildenv() { + export DEBIAN_FRONTEND=noninteractive + apt-get update + apt-get dist-upgrade -y + apt-get install --no-install-recommends -y \ + ant \ + ant-optional \ + ca-certificates \ + ccache \ + cpp \ + gcc \ + gettext \ + git \ + junit \ + libc6-dev \ + libglib2.0-dev \ + libgnutls28-dev \ + libjna-java \ + libnl-3-dev \ + libnl-route-3-dev \ + libtirpc-dev \ + libvirt-dev \ + libxml2-dev \ + libxml2-utils \ + locales \ + make \ + meson \ + ninja-build \ + openjdk-17-jdk-headless \ + perl-base \ + pkgconf \ + python3 \ + python3-docutils \ + xsltproc + sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen + dpkg-reconfigure locales + rm -f /usr/lib*/python3*/EXTERNALLY-MANAGED + dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt + mkdir -p /usr/libexec/ccache-wrappers + ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc + ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc +} + +export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers" +export LANG="en_US.UTF-8" +export MAKE="/usr/bin/make" +export NINJA="/usr/bin/ninja" +export PYTHON="/usr/bin/python3" diff --git a/ci/containers/almalinux-8.Dockerfile b/ci/containers/almalinux-9.Dockerfile similarity index 72% rename from ci/containers/almalinux-8.Dockerfile rename to ci/containers/almalinux-9.Dockerfile index 644e254..40db23b 100644 --- a/ci/containers/almalinux-8.Dockerfile +++ b/ci/containers/almalinux-9.Dockerfile @@ -4,20 +4,21 @@ # # https://gitlab.com/libvirt/libvirt-ci -FROM docker.io/library/almalinux:8 +FROM docker.io/library/almalinux:9 RUN dnf update -y && \ dnf install 'dnf-command(config-manager)' -y && \ - dnf config-manager --set-enabled -y powertools && \ - dnf install -y centos-release-advanced-virtualization && \ + dnf config-manager --set-enabled -y crb && \ dnf install -y epel-release && \ dnf install -y \ ant \ + ant-junit \ ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ + junit \ libvirt-devel \ rpm-build && \ dnf autoremove -y && \ diff --git a/ci/containers/centos-stream-8.Dockerfile b/ci/containers/centos-stream-9.Dockerfile similarity index 74% rename from ci/containers/centos-stream-8.Dockerfile rename to ci/containers/centos-stream-9.Dockerfile index 715f7c3..c29ddfb 100644 --- a/ci/containers/centos-stream-8.Dockerfile +++ b/ci/containers/centos-stream-9.Dockerfile @@ -4,21 +4,22 @@ # # https://gitlab.com/libvirt/libvirt-ci -FROM quay.io/centos/centos:stream8 +FROM quay.io/centos/centos:stream9 RUN dnf distro-sync -y && \ dnf install 'dnf-command(config-manager)' -y && \ - dnf config-manager --set-enabled -y powertools && \ - dnf install -y centos-release-advanced-virtualization && \ + dnf config-manager --set-enabled -y crb && \ dnf install -y epel-release && \ dnf install -y epel-next-release && \ dnf install -y \ ant \ + ant-junit \ ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ + junit \ libvirt-devel \ rpm-build && \ dnf autoremove -y && \ diff --git a/ci/containers/debian-11.Dockerfile b/ci/containers/debian-11.Dockerfile deleted file mode 100644 index ea3520b..0000000 --- a/ci/containers/debian-11.Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -# THIS FILE WAS AUTO-GENERATED -# -# $ lcitool manifest ci/manifest.yml -# -# https://gitlab.com/libvirt/libvirt-ci - -FROM docker.io/library/debian:11-slim - -RUN export DEBIAN_FRONTEND=noninteractive && \ - apt-get update && \ - apt-get install -y eatmydata && \ - eatmydata apt-get dist-upgrade -y && \ - eatmydata apt-get install --no-install-recommends -y \ - ant \ - ant-optional \ - ca-certificates \ - git \ - junit \ - libjna-java \ - libvirt-dev \ - locales \ - openjdk-17-jdk-headless && \ - eatmydata apt-get autoremove -y && \ - eatmydata apt-get autoclean -y && \ - sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \ - dpkg-reconfigure locales && \ - dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt - -ENV LANG "en_US.UTF-8" diff --git a/ci/containers/ubuntu-2004.Dockerfile b/ci/containers/debian-12.Dockerfile similarity index 96% rename from ci/containers/ubuntu-2004.Dockerfile rename to ci/containers/debian-12.Dockerfile index 6a39f5e..ec45fb8 100644 --- a/ci/containers/ubuntu-2004.Dockerfile +++ b/ci/containers/debian-12.Dockerfile @@ -4,7 +4,7 @@ # # https://gitlab.com/libvirt/libvirt-ci -FROM docker.io/library/ubuntu:20.04 +FROM docker.io/library/debian:12-slim RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update && \ diff --git a/ci/containers/fedora-39.Dockerfile b/ci/containers/fedora-39.Dockerfile index 9cb7d0b..afa350f 100644 --- a/ci/containers/fedora-39.Dockerfile +++ b/ci/containers/fedora-39.Dockerfile @@ -23,7 +23,7 @@ exec "$@"\n' > /usr/bin/nosync && \ ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ junit \ libvirt-devel \ diff --git a/ci/containers/fedora-38.Dockerfile b/ci/containers/fedora-40.Dockerfile similarity index 90% rename from ci/containers/fedora-38.Dockerfile rename to ci/containers/fedora-40.Dockerfile index c53703a..5d8f9b4 100644 --- a/ci/containers/fedora-38.Dockerfile +++ b/ci/containers/fedora-40.Dockerfile @@ -4,7 +4,7 @@ # # https://gitlab.com/libvirt/libvirt-ci -FROM registry.fedoraproject.org/fedora:38 +FROM registry.fedoraproject.org/fedora:40 RUN dnf install -y nosync && \ printf '#!/bin/sh\n\ @@ -23,7 +23,7 @@ exec "$@"\n' > /usr/bin/nosync && \ ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ junit \ libvirt-devel \ diff --git a/ci/containers/fedora-rawhide.Dockerfile b/ci/containers/fedora-rawhide.Dockerfile index 8fb86c0..fff03f4 100644 --- a/ci/containers/fedora-rawhide.Dockerfile +++ b/ci/containers/fedora-rawhide.Dockerfile @@ -24,7 +24,7 @@ exec "$@"\n' > /usr/bin/nosync && \ ca-certificates \ git \ glibc-langpack-en \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ junit \ libvirt-devel \ diff --git a/ci/containers/opensuse-leap-15.Dockerfile b/ci/containers/opensuse-leap-15.Dockerfile index 263f09f..535e449 100644 --- a/ci/containers/opensuse-leap-15.Dockerfile +++ b/ci/containers/opensuse-leap-15.Dockerfile @@ -4,16 +4,17 @@ # # https://gitlab.com/libvirt/libvirt-ci -FROM registry.opensuse.org/opensuse/leap:15.5 +FROM registry.opensuse.org/opensuse/leap:15.6 RUN zypper update -y && \ + zypper addrepo -fc https://download.opensuse.org/update/leap/15.6/backports/openSUSE:Backports:SLE-15-SP6:Update.repo && \ zypper install -y \ ant \ ant-junit \ ca-certificates \ git \ glibc-locale \ - java-11-openjdk-headless \ + java-21-openjdk-headless \ jna \ junit \ libvirt-devel \ diff --git a/ci/containers/ubuntu-2204.Dockerfile b/ci/containers/ubuntu-2204.Dockerfile index 6390620..b0076c8 100644 --- a/ci/containers/ubuntu-2204.Dockerfile +++ b/ci/containers/ubuntu-2204.Dockerfile @@ -14,44 +14,16 @@ RUN export DEBIAN_FRONTEND=noninteractive && \ ant \ ant-optional \ ca-certificates \ - ccache \ - cpp \ - gcc \ - gettext \ git \ junit \ - libc6-dev \ - libglib2.0-dev \ - libgnutls28-dev \ libjna-java \ - libnl-3-dev \ - libnl-route-3-dev \ - libtirpc-dev \ libvirt-dev \ - libxml2-dev \ - libxml2-utils \ locales \ - make \ - meson \ - ninja-build \ - openjdk-17-jdk-headless \ - perl-base \ - pkgconf \ - python3 \ - python3-docutils \ - xsltproc && \ + openjdk-17-jdk-headless && \ eatmydata apt-get autoremove -y && \ eatmydata apt-get autoclean -y && \ sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \ dpkg-reconfigure locales && \ - rm -f /usr/lib*/python3*/EXTERNALLY-MANAGED && \ - dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt && \ - mkdir -p /usr/libexec/ccache-wrappers && \ - ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \ - ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc + dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt -ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers" ENV LANG "en_US.UTF-8" -ENV MAKE "/usr/bin/make" -ENV NINJA "/usr/bin/ninja" -ENV PYTHON "/usr/bin/python3" diff --git a/ci/containers/ubuntu-2404.Dockerfile b/ci/containers/ubuntu-2404.Dockerfile new file mode 100644 index 0000000..1509b9a --- /dev/null +++ b/ci/containers/ubuntu-2404.Dockerfile @@ -0,0 +1,57 @@ +# THIS FILE WAS AUTO-GENERATED +# +# $ lcitool manifest ci/manifest.yml +# +# https://gitlab.com/libvirt/libvirt-ci + +FROM docker.io/library/ubuntu:24.04 + +RUN export DEBIAN_FRONTEND=noninteractive && \ + apt-get update && \ + apt-get install -y eatmydata && \ + eatmydata apt-get dist-upgrade -y && \ + eatmydata apt-get install --no-install-recommends -y \ + ant \ + ant-optional \ + ca-certificates \ + ccache \ + cpp \ + gcc \ + gettext \ + git \ + junit \ + libc6-dev \ + libglib2.0-dev \ + libgnutls28-dev \ + libjna-java \ + libnl-3-dev \ + libnl-route-3-dev \ + libtirpc-dev \ + libvirt-dev \ + libxml2-dev \ + libxml2-utils \ + locales \ + make \ + meson \ + ninja-build \ + openjdk-17-jdk-headless \ + perl-base \ + pkgconf \ + python3 \ + python3-docutils \ + xsltproc && \ + eatmydata apt-get autoremove -y && \ + eatmydata apt-get autoclean -y && \ + sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \ + dpkg-reconfigure locales && \ + rm -f /usr/lib*/python3*/EXTERNALLY-MANAGED && \ + dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt && \ + mkdir -p /usr/libexec/ccache-wrappers && \ + ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \ + ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc + +ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers" +ENV LANG "en_US.UTF-8" +ENV MAKE "/usr/bin/make" +ENV NINJA "/usr/bin/ninja" +ENV PYTHON "/usr/bin/python3" diff --git a/ci/gitlab.yml b/ci/gitlab.yml index 7bb68b8..0daab12 100644 --- a/ci/gitlab.yml +++ b/ci/gitlab.yml @@ -11,8 +11,11 @@ # - RUN_PIPELINE - force creation of a CI pipeline when # pushing to a branch in a forked repository. Official # CI pipelines are triggered when merge requests are -# created/updated. Setting this variable to a non-empty -# value allows CI testing prior to opening a merge request. +# created/updated. Setting this variable allows CI +# testing prior to opening a merge request. A value +# of "0" will create the pipeline but leave all jobs +# to be manually started, while "1" will immediately +# run all default jobs. # # - RUN_PIPELINE_UPSTREAM_ENV - same semantics as RUN_PIPELINE, # but uses the CI environment (containers) from the upstream project @@ -38,11 +41,13 @@ # # Aliases can be set for common usage # -# $ git config --local alias.push-ci "push -o ci.variable=RUN_PIPELINE=1" +# $ git config --local alias.push-ci "push -o ci.variable=RUN_PIPELINE=0" +# $ git config --local alias.push-ci-now "push -o ci.variable=RUN_PIPELINE=1" # # Allowing the less verbose invocation # -# $ git push-ci +# $ git push-ci (create pipeline but don't start jobs) +# $ git push-ci-now (create pipeline and start default jobs) # # Pipeline variables can also be set in the repository # pipeline config globally, or set against scheduled pipelines diff --git a/ci/gitlab/build-templates.yml b/ci/gitlab/build-templates.yml index fae09ac..5e6b28e 100644 --- a/ci/gitlab/build-templates.yml +++ b/ci/gitlab/build-templates.yml @@ -47,19 +47,27 @@ when: on_success # forks: pushes to a branch when a pipeline run in upstream env is explicitly requested - - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE_UPSTREAM_ENV && $JOB_OPTIONAL' + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE_UPSTREAM_ENV == "0"' when: manual allow_failure: true - - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE_UPSTREAM_ENV' + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE_UPSTREAM_ENV == "1" && $JOB_OPTIONAL' + when: manual + allow_failure: true + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE_UPSTREAM_ENV == "1"' when: on_success # forks: pushes to branches with pipeline requested - - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE && $JOB_OPTIONAL' + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE == "0"' + when: manual + allow_failure: true + variables: + IMAGE: $TARGET_BASE_IMAGE + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE == "1" && $JOB_OPTIONAL' when: manual allow_failure: true variables: IMAGE: $TARGET_BASE_IMAGE - - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE' + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE == "1"' when: on_success variables: IMAGE: $TARGET_BASE_IMAGE diff --git a/ci/gitlab/builds.yml b/ci/gitlab/builds.yml index bb513af..0ed5fd0 100644 --- a/ci/gitlab/builds.yml +++ b/ci/gitlab/builds.yml @@ -7,39 +7,39 @@ # Native build jobs -x86_64-almalinux-8: +x86_64-almalinux-9: extends: .native_build_job needs: - - job: x86_64-almalinux-8-container + - job: x86_64-almalinux-9-container optional: true allow_failure: false variables: - NAME: almalinux-8 - TARGET_BASE_IMAGE: docker.io/library/almalinux:8 + NAME: almalinux-9 + TARGET_BASE_IMAGE: docker.io/library/almalinux:9 TESTS: skip -x86_64-centos-stream-8: +x86_64-centos-stream-9: extends: .native_build_job needs: - - job: x86_64-centos-stream-8-container + - job: x86_64-centos-stream-9-container optional: true allow_failure: false variables: - NAME: centos-stream-8 - TARGET_BASE_IMAGE: quay.io/centos/centos:stream8 + NAME: centos-stream-9 + TARGET_BASE_IMAGE: quay.io/centos/centos:stream9 TESTS: skip -x86_64-debian-11: +x86_64-debian-12: extends: .native_build_job needs: - - job: x86_64-debian-11-container + - job: x86_64-debian-12-container optional: true allow_failure: false variables: - NAME: debian-11 - TARGET_BASE_IMAGE: docker.io/library/debian:11-slim + NAME: debian-12 + TARGET_BASE_IMAGE: docker.io/library/debian:12-slim x86_64-debian-sid: @@ -47,32 +47,32 @@ x86_64-debian-sid: needs: - job: x86_64-debian-sid-container optional: true - allow_failure: false + allow_failure: true variables: NAME: debian-sid TARGET_BASE_IMAGE: docker.io/library/debian:sid-slim -x86_64-fedora-38: +x86_64-fedora-39: extends: .native_build_job needs: - - job: x86_64-fedora-38-container + - job: x86_64-fedora-39-container optional: true allow_failure: false variables: - NAME: fedora-38 - TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:38 + NAME: fedora-39 + TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:39 -x86_64-fedora-39: +x86_64-fedora-40: extends: .native_build_job needs: - - job: x86_64-fedora-39-container + - job: x86_64-fedora-40-container optional: true allow_failure: false variables: - NAME: fedora-39 - TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:39 + NAME: fedora-40 + TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:40 x86_64-fedora-rawhide: @@ -80,7 +80,7 @@ x86_64-fedora-rawhide: needs: - job: x86_64-fedora-rawhide-container optional: true - allow_failure: false + allow_failure: true variables: NAME: fedora-rawhide TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:rawhide @@ -94,37 +94,37 @@ x86_64-opensuse-leap-15: allow_failure: false variables: NAME: opensuse-leap-15 - TARGET_BASE_IMAGE: registry.opensuse.org/opensuse/leap:15.5 + TARGET_BASE_IMAGE: registry.opensuse.org/opensuse/leap:15.6 -x86_64-ubuntu-2004: +x86_64-ubuntu-2204: extends: .native_build_job needs: - - job: x86_64-ubuntu-2004-container + - job: x86_64-ubuntu-2204-container optional: true allow_failure: false variables: - NAME: ubuntu-2004 - TARGET_BASE_IMAGE: docker.io/library/ubuntu:20.04 + NAME: ubuntu-2204 + TARGET_BASE_IMAGE: docker.io/library/ubuntu:22.04 -x86_64-ubuntu-2204: +x86_64-ubuntu-2404: extends: .native_build_job needs: - - job: x86_64-ubuntu-2204-container + - job: x86_64-ubuntu-2404-container optional: true allow_failure: false variables: - NAME: ubuntu-2204 - TARGET_BASE_IMAGE: docker.io/library/ubuntu:22.04 + NAME: ubuntu-2404 + TARGET_BASE_IMAGE: docker.io/library/ubuntu:24.04 -x86_64-ubuntu-2204-git: +x86_64-ubuntu-2404-git: extends: .native_git_build_job needs: - - job: x86_64-ubuntu-2204-container + - job: x86_64-ubuntu-2404-container optional: true allow_failure: false variables: - NAME: ubuntu-2204 - TARGET_BASE_IMAGE: docker.io/library/ubuntu:22.04 + NAME: ubuntu-2404 + TARGET_BASE_IMAGE: docker.io/library/ubuntu:24.04 diff --git a/ci/gitlab/containers.yml b/ci/gitlab/containers.yml index d58bdc6..81a9d9f 100644 --- a/ci/gitlab/containers.yml +++ b/ci/gitlab/containers.yml @@ -7,51 +7,51 @@ # Native container jobs -x86_64-almalinux-8-container: +x86_64-almalinux-9-container: extends: .container_job allow_failure: false variables: - NAME: almalinux-8 + NAME: almalinux-9 -x86_64-centos-stream-8-container: +x86_64-centos-stream-9-container: extends: .container_job allow_failure: false variables: - NAME: centos-stream-8 + NAME: centos-stream-9 -x86_64-debian-11-container: +x86_64-debian-12-container: extends: .container_job allow_failure: false variables: - NAME: debian-11 + NAME: debian-12 x86_64-debian-sid-container: extends: .container_job - allow_failure: false + allow_failure: true variables: NAME: debian-sid -x86_64-fedora-38-container: +x86_64-fedora-39-container: extends: .container_job allow_failure: false variables: - NAME: fedora-38 + NAME: fedora-39 -x86_64-fedora-39-container: +x86_64-fedora-40-container: extends: .container_job allow_failure: false variables: - NAME: fedora-39 + NAME: fedora-40 x86_64-fedora-rawhide-container: extends: .container_job - allow_failure: false + allow_failure: true variables: NAME: fedora-rawhide @@ -63,15 +63,15 @@ x86_64-opensuse-leap-15-container: NAME: opensuse-leap-15 -x86_64-ubuntu-2004-container: +x86_64-ubuntu-2204-container: extends: .container_job allow_failure: false variables: - NAME: ubuntu-2004 + NAME: ubuntu-2204 -x86_64-ubuntu-2204-container: +x86_64-ubuntu-2404-container: extends: .container_job allow_failure: false variables: - NAME: ubuntu-2204 + NAME: ubuntu-2404 diff --git a/ci/gitlab/sanity-checks.yml b/ci/gitlab/sanity-checks.yml index d2b1768..b568015 100644 --- a/ci/gitlab/sanity-checks.yml +++ b/ci/gitlab/sanity-checks.yml @@ -18,9 +18,13 @@ check-dco: when: on_success # forks: pushes to branches with pipeline requested (including upstream env pipelines) - - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $RUN_PIPELINE' + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $RUN_PIPELINE == "0"' + when: manual + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $RUN_PIPELINE == "1"' when: on_success - - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $RUN_PIPELINE_UPSTREAM_ENV' + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $RUN_PIPELINE_UPSTREAM_ENV == "0"' + when: manual + - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $RUN_PIPELINE_UPSTREAM_ENV == "1"' when: on_success # upstream+forks: that's all folks diff --git a/ci/manifest.yml b/ci/manifest.yml index 098263a..09966a4 100644 --- a/ci/manifest.yml +++ b/ci/manifest.yml @@ -1,43 +1,43 @@ projects: - libvirt-java - - libvirt+dist + - https://gitlab.com/libvirt/libvirt/-/raw/master/ci/lcitool/projects/libvirt+dist.yml gitlab: namespace: libvirt project: libvirt-java targets: - almalinux-8: + almalinux-9: jobs: - arch: x86_64 variables: TESTS: skip - centos-stream-8: + centos-stream-9: jobs: - arch: x86_64 variables: TESTS: skip - debian-11: x86_64 + debian-12: x86_64 debian-sid: x86_64 - fedora-38: x86_64 - fedora-39: x86_64 + fedora-40: x86_64 + fedora-rawhide: x86_64 opensuse-leap-15: x86_64 - ubuntu-2004: x86_64 + ubuntu-2204: x86_64 - ubuntu-2204: + ubuntu-2404: projects: - libvirt-java - - libvirt+dist - - libvirt+minimal + - https://gitlab.com/libvirt/libvirt/-/raw/master/ci/lcitool/projects/libvirt+minimal.yml + - https://gitlab.com/libvirt/libvirt/-/raw/master/ci/lcitool/projects/libvirt+dist.yml jobs: - arch: x86_64 From 1576ac9ad4dfe10d7ef922b7e417567053f215ec Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Tue, 12 Aug 2025 00:05:12 +0900 Subject: [PATCH 02/14] Expose virDomainMigrateToURI3 ... so that additional flags can be passed to Domain.migrateToURI. Fixes #8 Signed-off-by: Takashi Kajinami --- src/main/java/org/libvirt/Domain.java | 35 ++++++++++++++++++++++ src/main/java/org/libvirt/jna/Libvirt.java | 4 +++ 2 files changed, 39 insertions(+) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 72a9225..8bf48e2 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -1735,6 +1735,41 @@ public int migrateSetMaxDowntime(final long downtime) return processError(libvirt.virDomainMigrateSetMaxDowntime(vdp, downtime, 0)); } + /** + * Migrate the domain object from its current host to the destination + * denoted by a given URI. + *

+ * The destination is given either in dconnuri (if the + * {@link MigrateFlags#PEER2PEER PEER2PEER} + * is flag set), or in miguri (if neither the + * {@link MigrateFlags#PEER2PEER PEER2PEER} nor the + * {@link MigrateFlags#TUNNELED TUNNELED} migration + * flag is set in flags). + * + * @see + * virDomainMigrateToURI + * + * @param dconnuri + * (optional) URI for target libvirtd if @flags includes PEER2PEER + * @param params + * (optional) Migration parameters + * @param flags + * Controls the migrate + * @return 0 if successful + * @throws LibvirtException + */ + public int migrateToURI(final String dconnuri, + final TypedParameter[] params, + final int flags) + throws LibvirtException { + assert params != null : "migrate Typed parameters cannot be null"; + virTypedParameter[] input = generateNativeVirTypedParameters(params); + return processError(libvirt.virDomainMigrateToURI3(vdp, dconnuri, + input, input.length, + flags)); + } + /** * Migrate the domain object from its current host to the destination * denoted by a given URI. diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 8cd6448..e08306a 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -417,6 +417,10 @@ int virDomainMigrateToURI2(DomainPointer virDomainPtr, String dconnuri, String miguri, String dxml, NativeLong flags, String dname, NativeLong bandwidth); + int virDomainMigrateToURI3(DomainPointer virDomainPtr, + String dconnuri, + virTypedParameter[] params, int nparams, + int flags); int virDomainMemoryStats(DomainPointer virDomainPtr, virDomainMemoryStats[] stats, int nrStats, int flags); int virDomainPinVcpu(DomainPointer virDomainPtr, From 8301e98670a1b9e225e67df1ea293efc8124e516 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Wed, 13 Aug 2025 11:26:31 +0900 Subject: [PATCH 03/14] Fix missing Deprecated annotation Signed-off-by: Takashi Kajinami --- src/main/java/org/libvirt/ErrorException.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/libvirt/ErrorException.java b/src/main/java/org/libvirt/ErrorException.java index 86b3314..8d30ecf 100644 --- a/src/main/java/org/libvirt/ErrorException.java +++ b/src/main/java/org/libvirt/ErrorException.java @@ -7,6 +7,7 @@ * @author stoty * @deprecated */ +@Deprecated public class ErrorException extends Exception { private static final long serialVersionUID = -4329050530233404971L; From f5b956d0b9f8c53d80a1dcde5347e4d16ea39939 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Fri, 8 Aug 2025 16:44:23 +0900 Subject: [PATCH 04/14] Expose Domain CPU stats This exposes virDomainGetCPUStats API so that cpu stats, along with memory stats, can be obtained. Signed-off-by: Takashi Kajinami --- src/main/java/org/libvirt/Domain.java | 22 +++++++++++++++++++ src/main/java/org/libvirt/jna/Libvirt.java | 2 ++ .../java/org/libvirt/TestJavaBindings.java | 17 ++++++++++---- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 8bf48e2..49948f0 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -1504,6 +1504,28 @@ public void memoryPeek(final long start, final ByteBuffer buffer, assert buffer.position() == buffer.limit(); } + /** + * This function provides cpu statistics for the domain. + * + * @param start_cpu + * which cpu to start with, or -1 for summary + * @param ncpus + * how many cpus to query + * @return the collection of stats + * @throws LibvirtException + */ + public TypedParameter[] getCPUStats(final int start_cpu, final int ncpus) + throws LibvirtException { + int number = processError(libvirt.virDomainGetCPUStats(vdp, null, 0, start_cpu, ncpus, 0)); + virTypedParameter[] params = new virTypedParameter[number]; + int result = processError(libvirt.virDomainGetCPUStats(vdp, params, number, start_cpu, ncpus, 0)); + TypedParameter[] returnStats = new TypedParameter[result]; + for (int x = 0; x < result; x++) { + returnStats[x] = TypedParameter.create(params[x]); + } + return returnStats; + } + /** * This function provides memory statistics for the domain. * diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index e08306a..ed4839c 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -423,6 +423,8 @@ int virDomainMigrateToURI3(DomainPointer virDomainPtr, int flags); int virDomainMemoryStats(DomainPointer virDomainPtr, virDomainMemoryStats[] stats, int nrStats, int flags); + int virDomainGetCPUStats(DomainPointer virDomainPtr, + virTypedParameter[] params, int nparams, int start_cpu, int ncpus, int flags); int virDomainPinVcpu(DomainPointer virDomainPtr, int vcpu, byte[] cpumap, int maplen); int virDomainPMSuspendForDuration(DomainPointer virDomainPtr, diff --git a/src/test/java/org/libvirt/TestJavaBindings.java b/src/test/java/org/libvirt/TestJavaBindings.java index 79173c4..781fcc3 100644 --- a/src/test/java/org/libvirt/TestJavaBindings.java +++ b/src/test/java/org/libvirt/TestJavaBindings.java @@ -187,15 +187,24 @@ private void validateDomainData(Domain dom) throws Exception { System.out.println(c.getTypeAsString() + ":" + c.field + ":" + c.getValueAsString()); } - dom.getSchedulerParameters() ; - + dom.getSchedulerParameters(); + SchedUintParameter[] pars = new SchedUintParameter[1]; pars[0] = new SchedUintParameter(); pars[0].field = "weight"; pars[0].value = 100; dom.setSchedulerParameters(pars); - - dom.getSchedulerParameters() ; + + dom.getSchedulerParameters(); + + TypedParameter[] cpuStats = dom.getCPUStats(-1, 1); + assertEquals(3, cpuStats.length); + assertEquals("cpu_time", cpuStats[0].field); + assertEquals("48772617035", cpuStats[0].getValueAsString()); + assertEquals("user_time", cpuStats[1].field); + assertEquals("5540000000", cpuStats[1].getValueAsString()); + assertEquals("system_time", cpuStats[2].field); + assertEquals("6460000000", cpuStats[2].getValueAsString()); } public void testInterfaces() throws Exception { From 7305cef2f2735127cbe9e1da749407f18137e256 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Fri, 8 Aug 2025 18:56:08 +0900 Subject: [PATCH 05/14] Remove trailing whitespaces Signed-off-by: Takashi Kajinami --- .../java/org/libvirt/TestJavaBindings.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/test/java/org/libvirt/TestJavaBindings.java b/src/test/java/org/libvirt/TestJavaBindings.java index 781fcc3..49d5a6f 100644 --- a/src/test/java/org/libvirt/TestJavaBindings.java +++ b/src/test/java/org/libvirt/TestJavaBindings.java @@ -61,7 +61,7 @@ public void testConnection() throws Exception { assertEquals("conn.getVersion()", 2, conn.getVersion()); assertTrue("conn.isAlive", conn.isAlive()); assertTrue("conn.isEncrypted", conn.isEncrypted() == 0); - assertTrue("conn.isSecure", conn.isSecure() == 1); + assertTrue("conn.isSecure", conn.isSecure() == 1); } /* @@ -110,8 +110,8 @@ public void testNetworkCreate() throws Exception { assertEquals("Number of defined networks", 1, conn.numOfDefinedNetworks()); assertEquals("Number of listed defined networks", 1, conn.listDefinedNetworks().length); assertTrue("Network1 should not be persistent", network1.isPersistent() == 0); - assertTrue("Network1 should not be active", network1.isActive() == 1); - assertTrue("Network2 should be active", network2.isActive() == 0); + assertTrue("Network1 should not be active", network1.isActive() == 1); + assertTrue("Network2 should be active", network2.isActive() == 0); this.validateNetworkData(network2); this.validateNetworkData(conn.networkLookupByName("deftest")); this.validateNetworkData(conn.networkLookupByUUID(UUIDArray)); @@ -157,8 +157,8 @@ public void testDomainCreate() throws Exception { assertEquals("Number of defined domains", 1, conn.numOfDefinedDomains()); assertEquals("Number of listed defined domains", 1, conn.listDefinedDomains().length); assertTrue("Domain1 should be persistent", dom1.isPersistent() == 1); - assertTrue("Domain1 should not be active", dom1.isActive() == 0); - assertTrue("Domain2 should be active", dom2.isActive() == 1); + assertTrue("Domain1 should not be active", dom1.isActive() == 0); + assertTrue("Domain2 should be active", dom2.isActive() == 1); this.validateDomainData(dom2); this.validateDomainData(conn.domainLookupByName("createst")); this.validateDomainData(conn.domainLookupByUUID(UUIDArray)); @@ -216,7 +216,7 @@ public void testInterfaces() throws Exception { assertEquals("virtInterfaceGetName", "eth1", virtInt.getName()); assertEquals("virtInterfaceGetMACString", "aa:bb:cc:dd:ee:ff", virtInt.getMACString()); assertNotNull("virtInterfaceGetXMLDesc", virtInt.getXMLDescription(0)); - assertTrue("virInterfaceIsActive", virtInt.isActive() == 1); + assertTrue("virInterfaceIsActive", virtInt.isActive() == 1); System.out.println(virtInt.getXMLDescription(0)); String newXML = "" + "" @@ -243,7 +243,7 @@ public void testAccessAfterClose() throws Exception { } assertNotNull(virException); } - + public void testStoragePool() throws Exception { StoragePool pool1 = conn.storagePoolDefineXML("" + " pool1" @@ -254,14 +254,14 @@ public void testStoragePool() throws Exception { + "", 0) ; StoragePool defaultPool = conn.storagePoolLookupByName("default-pool"); assertEquals("numOfStoragePools:", 1, conn.numOfStoragePools()); - assertEquals("numOfDefinedStoragePools:", 1, conn.numOfDefinedStoragePools()); + assertEquals("numOfDefinedStoragePools:", 1, conn.numOfDefinedStoragePools()); assertNotNull("The pool should not be null", pool1); - assertNotNull("The default pool should not be null", defaultPool); + assertNotNull("The default pool should not be null", defaultPool); assertEquals("The names should match", defaultPool.getName(), "default-pool"); - assertEquals("The uids should match", pool1.getUUIDString(), "004c96e1-2d78-c30f-5aa5-f03c87d21e67"); + assertEquals("The uids should match", pool1.getUUIDString(), "004c96e1-2d78-c30f-5aa5-f03c87d21e67"); assertTrue("pool1 should be persistent", pool1.isPersistent() == 1); - assertTrue("pool1 should not be active", pool1.isActive() == 0); - assertTrue("Domain2 should be active", defaultPool.isActive() == 1); + assertTrue("pool1 should not be active", pool1.isActive() == 0); + assertTrue("Domain2 should be active", defaultPool.isActive() == 1); } public void testDomainEvents() throws Exception { From dda928e03a3318360cc2ecc73776d106ef8efd61 Mon Sep 17 00:00:00 2001 From: Mitsuru Kariya Date: Sun, 31 Aug 2025 23:49:29 +0900 Subject: [PATCH 06/14] Fix memory leak in Connect.listAllDomains free was missing for the pointer returned in domains by virConnectListAllDomains, so this has been fixed. cf. https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectListAllDomains Signed-off-by: Mitsuru Kariya --- src/main/java/org/libvirt/Connect.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/libvirt/Connect.java b/src/main/java/org/libvirt/Connect.java index 28f7a6c..57727b4 100644 --- a/src/main/java/org/libvirt/Connect.java +++ b/src/main/java/org/libvirt/Connect.java @@ -18,6 +18,7 @@ import static org.libvirt.BitFlagsHelper.OR; import com.sun.jna.Memory; +import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.LongByReference; @@ -1499,17 +1500,14 @@ public Domain[] listAllDomains(int flags) throws LibvirtException { DomainByReference domainByReference = new DomainByReference(); int domainsCount = processError(libvirt.virConnectListAllDomains(vcp, domainByReference, flags)); - Pointer[] pointerArray = domainByReference.getValue().getPointerArray(0, domainsCount); - if (domainsCount > 0) { - Domain[] domains = new Domain[domainsCount]; - for (int i = 0; i < domainsCount; i++) { - domains[i] = new Domain(this, new DomainPointer(pointerArray[i])); - } - - return domains; + Pointer pointer = domainByReference.getValue(); + Domain[] domains = new Domain[domainsCount]; + for (int i = 0; i < domainsCount; i++) { + domains[i] = new Domain(this, new DomainPointer(pointer.getPointer(i * Native.POINTER_SIZE))); } + Library.free(pointer); - return new Domain[]{}; + return domains; } /** From e022ed1eadb2fd6e4492a959445183339b978bbb Mon Sep 17 00:00:00 2001 From: Francisco Manuel Garcia Botella Date: Mon, 1 Sep 2025 16:41:30 +0200 Subject: [PATCH 07/14] Fix doc: Suppress warning - Tag @see: missing final '>' Fix a typo in Javadoc. When running autobuild.sh it raised a warning indicating missing final '>' in @see tag. Signed-off-by: Francisco Manuel Garcia Botella --- src/main/java/org/libvirt/Domain.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 49948f0..6b109c3 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -123,7 +123,7 @@ public static final class BlockCopyParameters { /** * Contains multiple constants that defines "virDomainMigrate* params" multiple field. * @see Libvirt domain documentation., and - * libvirt-domain.h. + * libvirt-domain.h */ public static final class DomainMigrateParameters { /** From 1c458084c64370ffd4df15a38c20c1755140c5e1 Mon Sep 17 00:00:00 2001 From: Mitsuru Kariya Date: Sun, 7 Sep 2025 14:46:53 +0900 Subject: [PATCH 08/14] Add virResetError Although virConnCopyLastError and virCopyLastError are provided, using them requires freeing the string memory area with virResetError. Therefore, add virResetError. Also fix mistakes in the Javadoc "missig api in 0.1.0" list: - virConnCopyLastError is provided - virFreeError is not missing in 0.1.0 (it is listed as missing in 0.6.1) Signed-off-by: Mitsuru Kariya --- src/main/java/org/libvirt/jna/Libvirt.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index ed4839c..9dbc7e2 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -23,8 +23,6 @@ * Known api calls to be missing * LIBVIRT_0.1.0 * virDefaultErrorFunc - * virConnCopyLastError - * virFreeError * * LIBVIRT_0_5.0 * virEventRegisterImpl @@ -312,6 +310,7 @@ int virGetVersion(LongByReference libVer, String type, LongByReference typeVer); int virInitialize(); int virCopyLastError(virError error); + int virResetError(virError error); virError virGetLastError(); void virResetLastError(); void virSetErrorFunc(Pointer userData, VirErrorCallback callback); From 9f4e61b79c2582e40337e3df2d2d71e24351ed37 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Wed, 24 Sep 2025 11:07:56 +0900 Subject: [PATCH 09/14] Expose virDomainGetJobStats Expose virtDomainGetJobStats . This is useful especially when we want to query jobs actually running. Co-Authored-By: Mitsuru Kariya Signed-off-by: Takashi Kajinami --- src/main/java/org/libvirt/Domain.java | 56 ++++++++++++++++++- src/main/java/org/libvirt/DomainJobStats.java | 11 ++++ src/main/java/org/libvirt/jna/Libvirt.java | 4 ++ .../org/libvirt/jna/virTypedParameter.java | 8 +++ 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/libvirt/DomainJobStats.java diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 6b109c3..ddea097 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -339,6 +339,31 @@ public static final class BlockResizeFlags { public static final int BYTES = 1; } + public static final class JobType { + /** No job is active **/ + public static int NONE = bit(0); + + /** Job with a finite completion time **/ + public static int BOUNDED = bit(1); + + /** Job without a finite completion time **/ + public static int UNBOUNDED = bit(2); + + /** Job has finished, but isn't cleaned up **/ + public static int COMPLETED = bit(3); + + /** Job hit error, but isn't cleaned up **/ + public static int FAILED = bit(4); + + /** Job was aborted, but isn't cleaned up **/ + public static int CANCELLED = bit(5); + } + + public static final class GetJobStatsFlags { + public static int COMPLETED = bit(0); + public static int KEEP_COMPLETED = bit(1); + } + public static final class CreateFlags { /** Default behavior */ public static final int NONE = 0; @@ -1092,7 +1117,7 @@ public DomainInfo getInfo() throws LibvirtException { * @see Libvirt * Documentation - * @return a DomainJobInfo object describing this domain + * @return a DomainJobInfo object * @throws LibvirtException */ public DomainJobInfo getJobInfo() throws LibvirtException { @@ -1101,6 +1126,35 @@ public DomainJobInfo getJobInfo() throws LibvirtException { return new DomainJobInfo(vInfo); } + /** + * Extract information about progress of a background job on a domain. Will + * return an error if the domain is not active. + * + * @see Libvirt + * Documentation + * @param flags + * flags + * @return a DomainJobStats object + * @throws LibvirtException + */ + public DomainJobStats getJobStats(final int flags) throws LibvirtException { + IntByReference type = new IntByReference(); + PointerByReference params = new PointerByReference(); + IntByReference nParams = new IntByReference(); + + processError(libvirt.virDomainGetJobStats(vdp, type, params, nParams, flags)); + + int n = nParams.getValue(); + virTypedParameter[] typedParams = (virTypedParameter[]) new virTypedParameter(params.getValue()).toArray(n); + TypedParameter[] stats = new TypedParameter[n]; + for (int i = 0; i < n; i++) { + stats[i] = TypedParameter.create(typedParams[i]); + } + libvirt.virTypedParamsFree(typedParams, n); + return new DomainJobStats(type.getValue(), stats); + } + /** * Retrieve the maximum amount of physical memory allocated to a domain. * diff --git a/src/main/java/org/libvirt/DomainJobStats.java b/src/main/java/org/libvirt/DomainJobStats.java new file mode 100644 index 0000000..7972283 --- /dev/null +++ b/src/main/java/org/libvirt/DomainJobStats.java @@ -0,0 +1,11 @@ +package org.libvirt; + +public class DomainJobStats { + public int type; + public TypedParameter[] stats; + + public DomainJobStats(int type, TypedParameter[] stats) { + this.type = type; + this.stats = stats; + } +} diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 9dbc7e2..92f4224 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -358,6 +358,8 @@ int virDomainGetBlockInfo(DomainPointer virDomainPtr, String path, int virDomainGetID(DomainPointer virDomainPtr); int virDomainGetInfo(DomainPointer virDomainPtr, virDomainInfo vInfo); int virDomainGetJobInfo(DomainPointer virDomainPtr, virDomainJobInfo vInfo); + int virDomainGetJobStats(DomainPointer virDomainPt, IntByReference type, PointerByReference params, + IntByReference nparams, int flags); NativeLong virDomainGetMaxMemory(DomainPointer virDomainPtr); int virDomainGetMaxVcpus(DomainPointer virDomainPtr); String virDomainGetMetadata(DomainPointer virDomainPtr, int type, String uri, int flags); @@ -661,4 +663,6 @@ int virEventAddTimeout(int milliSeconds, VirEventTimeoutCallback cb, int virDomainSetUserPassword(DomainPointer virDomainPtr, String user, String password, int flags); + + void virTypedParamsFree(virTypedParameter[] params, int nparams); } diff --git a/src/main/java/org/libvirt/jna/virTypedParameter.java b/src/main/java/org/libvirt/jna/virTypedParameter.java index 992ffad..ab2ce01 100644 --- a/src/main/java/org/libvirt/jna/virTypedParameter.java +++ b/src/main/java/org/libvirt/jna/virTypedParameter.java @@ -1,5 +1,6 @@ package org.libvirt.jna; +import com.sun.jna.Pointer; import com.sun.jna.Structure; import java.util.Arrays; @@ -16,6 +17,13 @@ public class virTypedParameter extends Structure { public int type; public virTypedParameterValue value; + public virTypedParameter() { + } + + public virTypedParameter(Pointer ptr) { + super(ptr); + } + private static final List FIELDS = Arrays.asList( "field", "type", "value"); From 48dfbc13274c3b819c0b35ac6026670308f996c0 Mon Sep 17 00:00:00 2001 From: Mitsuru Kariya Date: Wed, 1 Oct 2025 00:30:19 +0900 Subject: [PATCH 10/14] Fix Domain.getJobStats Fix the following issues in Domain.getJobStats: - Fix an exception that occurred when the virTypedParameter[] had zero elements. virDomainGetJobStats returns successfully with *params == NULL and *nparams == 0 when *type == VIR_DOMAIN_JOB_NONE. However, calling Structure.toArray(n) with n == 0 causes an ArrayIndexOutOfBoundsException. This is avoided by directly returning an empty array when *nparams == 0. - Fix the issue where the first element of virTypedParameter[] was not being read. The Structure constructor does not automatically read fields. This is fixed by explicitly calling the virTypedParameter.read() method for the first element. Note: Structure.toArray(n) automatically reads fields (i.e., calls the virTypedParameter.read() method) for all elements except the first. - Fix the issue where the value was not being read when virTypedParameter was a String. Union does not perform pointer-to-value reads (such as char* -> String) unless it is the active element. This is fixed by explicitly reading the String when virTypedParameter.type == VIR_TYPED_STRING. - Fix a potential crash in virTypedParamsFree when handling String parameters. When passing a Structure received from a native function as an argument to another native function: - String fields directly embedded in the Structure are not updated in native memory if their values haven't changed. - However, Unions embedded in the Structure always update native memory for the active element, even if the value hasn't changed. Therefore, if the active element of the Union is a String, JNA allocates new memory for the string and overwrites the received char* pointer. This not only causes the original char* pointer to be leaked, but also leads to double-free issues: once by virTypedParamsFree and again by GC on the JNA-allocated memory. This is avoided by changing the argument type of virTypedParamsFree from virTypedParameter[] to Pointer. Additionally, extract the conversion from a pointer to a virTypedParameter array to a TypedParameter array into a static method of TypedParameter, as there are other functions that also receive virTypedParameter arrays. Signed-off-by: Mitsuru Kariya --- src/main/java/org/libvirt/Domain.java | 8 +---- src/main/java/org/libvirt/TypedParameter.java | 33 ++++++++++++++----- src/main/java/org/libvirt/jna/Libvirt.java | 2 +- .../org/libvirt/jna/virTypedParameter.java | 16 +++++++++ 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index ddea097..25cf3c7 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -1145,13 +1145,7 @@ public DomainJobStats getJobStats(final int flags) throws LibvirtException { processError(libvirt.virDomainGetJobStats(vdp, type, params, nParams, flags)); - int n = nParams.getValue(); - virTypedParameter[] typedParams = (virTypedParameter[]) new virTypedParameter(params.getValue()).toArray(n); - TypedParameter[] stats = new TypedParameter[n]; - for (int i = 0; i < n; i++) { - stats[i] = TypedParameter.create(typedParams[i]); - } - libvirt.virTypedParamsFree(typedParams, n); + TypedParameter[] stats = TypedParameter.fromPointer(params.getValue(), nParams.getValue()); return new DomainJobStats(type.getValue(), stats); } diff --git a/src/main/java/org/libvirt/TypedParameter.java b/src/main/java/org/libvirt/TypedParameter.java index 4474d65..77f280a 100644 --- a/src/main/java/org/libvirt/TypedParameter.java +++ b/src/main/java/org/libvirt/TypedParameter.java @@ -1,22 +1,22 @@ package org.libvirt; import com.sun.jna.Native; +import com.sun.jna.Pointer; import org.libvirt.jna.Libvirt; import org.libvirt.jna.virTypedParameter; import org.libvirt.jna.virTypedParameterValue; -import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.Arrays; public abstract class TypedParameter { - protected static final int TYPED_PARAM_INT = 1; - protected static final int TYPED_PARAM_UINT = 2; - protected static final int TYPED_PARAM_LONG = 3; - protected static final int TYPED_PARAM_ULONG = 4; - protected static final int TYPED_PARAM_DOUBLE = 5; - protected static final int TYPED_PARAM_BOOLEAN = 6; - protected static final int TYPED_PARAM_STRING = 7; + protected static final int TYPED_PARAM_INT = virTypedParameter.TYPED_PARAM_INT; + protected static final int TYPED_PARAM_UINT = virTypedParameter.TYPED_PARAM_UINT; + protected static final int TYPED_PARAM_LONG = virTypedParameter.TYPED_PARAM_LONG; + protected static final int TYPED_PARAM_ULONG = virTypedParameter.TYPED_PARAM_ULONG; + protected static final int TYPED_PARAM_DOUBLE = virTypedParameter.TYPED_PARAM_DOUBLE; + protected static final int TYPED_PARAM_BOOLEAN = virTypedParameter.TYPED_PARAM_BOOLEAN; + protected static final int TYPED_PARAM_STRING = virTypedParameter.TYPED_PARAM_STRING; /** * Parameter name @@ -44,6 +44,8 @@ public abstract class TypedParameter { */ public abstract String getValueAsString(); + private static final TypedParameter[] EMPTY = new TypedParameter[0]; + public static TypedParameter create(final virTypedParameter vParam) { TypedParameter returnValue = null; if (vParam != null) { @@ -126,4 +128,19 @@ public static byte[] copyOf(final byte[] original, final int length) { System.arraycopy(original, 0, returnValue, 0, originalLength); return returnValue; } + + public static TypedParameter[] fromPointer(Pointer ptr, int n) { + if (n == 0) { + return EMPTY; + } + virTypedParameter param = new virTypedParameter(ptr); + param.read(); + virTypedParameter[] params = (virTypedParameter[]) param.toArray(n); + TypedParameter[] stats = new TypedParameter[n]; + for (int i = 0; i < n; i++) { + stats[i] = TypedParameter.create(params[i]); + } + Libvirt.INSTANCE.virTypedParamsFree(ptr, n); + return stats; + } } diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 92f4224..87e3f58 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -664,5 +664,5 @@ int virEventAddTimeout(int milliSeconds, VirEventTimeoutCallback cb, int virDomainSetUserPassword(DomainPointer virDomainPtr, String user, String password, int flags); - void virTypedParamsFree(virTypedParameter[] params, int nparams); + void virTypedParamsFree(Pointer params, int nparams); } diff --git a/src/main/java/org/libvirt/jna/virTypedParameter.java b/src/main/java/org/libvirt/jna/virTypedParameter.java index ab2ce01..00b2ded 100644 --- a/src/main/java/org/libvirt/jna/virTypedParameter.java +++ b/src/main/java/org/libvirt/jna/virTypedParameter.java @@ -13,6 +13,14 @@ * virMemoryParameter since Libvirt 0.9.2. */ public class virTypedParameter extends Structure { + public static final int TYPED_PARAM_INT = 1; + public static final int TYPED_PARAM_UINT = 2; + public static final int TYPED_PARAM_LONG = 3; + public static final int TYPED_PARAM_ULONG = 4; + public static final int TYPED_PARAM_DOUBLE = 5; + public static final int TYPED_PARAM_BOOLEAN = 6; + public static final int TYPED_PARAM_STRING = 7; + public byte[] field = new byte[Libvirt.VIR_TYPED_PARAM_FIELD_LENGTH]; public int type; public virTypedParameterValue value; @@ -24,6 +32,14 @@ public virTypedParameter(Pointer ptr) { super(ptr); } + @Override + public void read() { + super.read(); + if (type == TYPED_PARAM_STRING) { + value.readField("s"); + } + } + private static final List FIELDS = Arrays.asList( "field", "type", "value"); From c945e7c08c9b0d791d3804480cf74d1b08a4046f Mon Sep 17 00:00:00 2001 From: Mitsuru Kariya Date: Tue, 9 Sep 2025 01:59:23 +0900 Subject: [PATCH 11/14] Fix incorrect argument type in virDomainMigrate3 The 5th argument `flags` of `virDomainMigrate3` is `unsigned int`, not `unsigned long`. Therefore, the Java binding should use `int` instead of `NativeLong`. To maintain backward compatibility, the version taking `NativeLong` as an argument has been deprecated, and a new version taking `int` has been added. Although not fully verified, it is likely that no practical issue occurs on supported platforms because: - On 32-bit platforms, `long` and `int` are the same size. - On 64-bit platforms, the 5th argument is passed via a register. Signed-off-by: Mitsuru Kariya --- src/main/java/org/libvirt/Domain.java | 49 +++++++++++++++++++++- src/main/java/org/libvirt/jna/Libvirt.java | 12 ++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 25cf3c7..3db9134 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -1741,6 +1741,11 @@ public Domain migrate(final Connect dconn, final long flags, * after the returned domain object is no longer needed. *

* For more informations, please @see virDomainMigrate3 + * + * @deprecated + * use {@link migrate(Connect, TypedParameter[], int) + * migrate(Connect, TypedParameter[], int)} + * instaed * @param dconn * destination host (a Connect object) * @param params @@ -1754,10 +1759,52 @@ public Domain migrate(final Connect dconn, final long flags, * connection (dconn). * @throws LibvirtException */ + @Deprecated public Domain migrate(final Connect dconn, final TypedParameter[] params, long flags) throws LibvirtException { assert params != null : "migrate Typed parameters cannot be null"; virTypedParameter[] virTypedParameters = generateNativeVirTypedParameters(params); - DomainPointer newPtr = processError(libvirt.virDomainMigrate3(vdp, dconn.vcp, virTypedParameters, params.length, new NativeLong(flags))); + DomainPointer newPtr = processError(libvirt.virDomainMigrate3(vdp, dconn.vcp, virTypedParameters, params.length, (int)flags)); + return new Domain(dconn, newPtr); + } + + /** + * Migrate the domain object from its current host to the destination host + * given by {@code dconn} (a connection to the destination host). + *

See {@link DomainMigrateParameters DomainMigrateParameters} for + * detailed description of individual {@code params}. + *

See {@link MigrateFlags MigrateFlags} documentation for description + * of individual {@code flags}. {@link MigrateFlags#TUNNELED TUNNELED} + * and {@link MigrateFlags#PEER2PEER PEER2PEER} are not supported by this + * API, use {@link migrateToURI(String, TypedParameter[], int) + * migrateToURI(String, TypedParameter[], int)} instead. + *

There are many limitations on migration imposed by the underlying + * technology - for example it may not be possible to migrate between + * different processors even with the same architecture, or between different + * types of hypervisor. + *

{@link free} should be used to free the resources + * after the returned domain object is no longer needed. + * + * @see + * virDomainMigrate3 + * + * @param dconn + * destination host (a Connect object) + * @param params + * (optional) migration parameters + * + * @param flags + * bitwise-OR of {@link MigrateFlags MigrateFlags} + * @return + * the new domain object if the migration was successful. Note that + * the new domain object exists in the scope of the destination + * connection ({@code dconn}). + * @throws LibvirtException on failure + */ + public Domain migrate(final Connect dconn, final TypedParameter[] params, int flags) throws LibvirtException { + assert params != null : "migrate Typed parameters cannot be null"; + virTypedParameter[] virTypedParameters = generateNativeVirTypedParameters(params); + DomainPointer newPtr = processError(libvirt.virDomainMigrate3(vdp, dconn.vcp, virTypedParameters, params.length, flags)); return new Domain(dconn, newPtr); } diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 87e3f58..688bacc 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -405,11 +405,23 @@ DomainPointer virDomainMigrate2(DomainPointer virDomainPtr, ConnectionPointer virConnectPtr, String dxml, NativeLong flags, String dname, String uri, NativeLong bandwidth); + /** + * @deprecated use {@link virDomainMigrate3(DomainPointer, + * ConnectionPointer, virTypedParameter[], int, int) + * virDomainMigrate3(DomainPointer, ConnectionPointer, + * virTypedParameter[], int, int)} instead. + */ + @Deprecated DomainPointer virDomainMigrate3(DomainPointer virDomainPtr, ConnectionPointer virConnectPtr, virTypedParameter[] params, int nparams, NativeLong flags); + DomainPointer virDomainMigrate3(DomainPointer virDomainPtr, + ConnectionPointer virConnectPtr, + virTypedParameter[] params, + int nparams, + int flags); int virDomainMigrateSetMaxDowntime(DomainPointer virDomainPtr, long downtime, int flags); int virDomainMigrateToURI(DomainPointer virDomainPtr, String duri, From d2658a45073a5e81a628fbbab9654eddeb722899 Mon Sep 17 00:00:00 2001 From: Francisco Manuel Garcia Botella Date: Tue, 2 Sep 2025 10:53:34 +0200 Subject: [PATCH 12/14] Add DomainCheckpoint binding Created the bindings to manage the domain checkpoints of a domain. Added tests to check the functionality of these bindings. Signed-off-by: Francisco Manuel Garcia Botella --- src/main/java/org/libvirt/Domain.java | 203 ++++++++++++++ .../java/org/libvirt/DomainCheckpoint.java | 252 ++++++++++++++++++ .../libvirt/jna/DomainCheckpointPointer.java | 18 ++ src/main/java/org/libvirt/jna/Libvirt.java | 25 ++ .../java/org/libvirt/TestJavaBindings.java | 172 ++++++++++++ 5 files changed, 670 insertions(+) create mode 100644 src/main/java/org/libvirt/DomainCheckpoint.java create mode 100644 src/main/java/org/libvirt/jna/DomainCheckpointPointer.java diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 3db9134..bfd647a 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -16,6 +16,7 @@ import org.libvirt.event.RebootListener; import org.libvirt.jna.CString; import org.libvirt.jna.CStringByReference; +import org.libvirt.jna.DomainCheckpointPointer; import org.libvirt.jna.DomainPointer; import org.libvirt.jna.DomainSnapshotPointer; import org.libvirt.jna.Libvirt; @@ -520,6 +521,73 @@ public static final class RebootFlags { /** Use paravirt guest control */ public static final int PARAVIRT = bit(4); } + + public static final class CheckpointCreateFlags { + + /** Restore or alter metadata (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int REDEFINE = bit(0); + + /** use guest agent to quiesce all mounted file + * systems within the domain (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int QUIESCE = bit(1); + + /** validate disk data state when redefining + * a checkpoint (Since: 6.10.0) + * + * @see + * Libvirt Documentation + */ + public static final int REDEFINE_VALIDATE = bit(2); + } + + public static final class CheckpointListFlags { + + /** List all descendants, not just children, when + * listing a checkpoint (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int DESCENDANTS = bit(0); + + /** Filter by checkpoints with no parents, when + * listing a domain (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int ROOTS = bit(0); + + /** Ensure parents occur before children in + * the resulting list (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int TOPOLOGICAL = bit(1); + + /** Filter by checkpoints with no children (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int LEAVES = bit(2); + + /** Filter by checkpoints that have children (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int NO_LEAVES = bit(3); + } public static final class SnapshotCreateFlags { @@ -2348,6 +2416,141 @@ public void shutdown() throws LibvirtException { processError(libvirt.virDomainShutdown(vdp)); } + /** + * Creates a new checkpoint of a domain based on the checkpoint xml contained in + * xmlDesc. + * + * @see Libvirt + * Documentation + * @param xmlDesc + * string containing an XML description of the checkpoint + * @param flags + * flags for creating the checkpoint, see the {@link CheckpointCreateFlags} for the flag options + * @return the checkpoint + * @throws LibvirtException + */ + public DomainCheckpoint checkpointCreateXML(final String xmlDesc, final int flags) + throws LibvirtException { + DomainCheckpointPointer ptr = processError(libvirt.virDomainCheckpointCreateXML(vdp, xmlDesc, flags)); + return new DomainCheckpoint(virConnect, ptr); + } + + /** + * Creates a new checkpoint of a domain based on the checkpoint xml contained in + * xmlDesc. + *

+ * This is just a convenience method, it has the same effect + * as calling {@code checkpointCreateXML(xmlDesc, 0);}. + * + * @see #checkpointCreateXML(String, int) + * @see Libvirt + * Documentation + * @param xmlDesc + * string containing an XML description of the checkpoint + * @return the checkpoint, or null on Error + * @throws LibvirtException + */ + public DomainCheckpoint checkpointCreateXML(final String xmlDesc) + throws LibvirtException { + return checkpointCreateXML(xmlDesc, 0); + } + + /** + * Array of domain checkpoints for the given domain. + * + * @see Libvirt + * Documentation + * + * @param flags + * flags for list the checkpoint, see the {@link CheckpointListFlags} for the flag options + * @return Array with domain checkpoints of the given domain + * @throws LibvirtException + */ + public DomainCheckpoint[] listAllCheckpoints(int flags) throws LibvirtException { + PointerByReference checkpoints = new PointerByReference(); + int count = libvirt.virDomainListAllCheckpoints(vdp, checkpoints, flags); + if (checkpoints.getValue() == null) { + if (count != 0) { + processError(count); + throw new IllegalStateException("virDomainListAllCheckpoints returned " + count); + } + return new DomainCheckpoint[0]; + } + + try { + if (count < 0) { + processError(count); + throw new IllegalStateException("virDomainListAllCheckpoints returned " + count); + } + DomainCheckpoint[] result = new DomainCheckpoint[count]; + Pointer arrayPtr = checkpoints.getValue(); + for (int i = 0; i < count; i++) { + Pointer p = arrayPtr.getPointer((long) i * Native.POINTER_SIZE); + result[i] = new DomainCheckpoint(virConnect, new DomainCheckpointPointer(p)); + } + return result; + } finally { + Library.free(checkpoints.getValue()); + } + } + + /** + * Retrieve a checkpoint based on its name + * + * @see Libvirt + * Documentation + * @param name + * name for the domain checkpoint + * @return The domain checkpoint or null in case of not found + * @throws LibvirtException + */ + public DomainCheckpoint checkpointLookupByName(final String name) + throws LibvirtException { + DomainCheckpointPointer ptr = libvirt.virDomainCheckpointLookupByName(vdp, name, 0); + if (ptr == null) { + return null; + } + return new DomainCheckpoint(virConnect, ptr); + } + + /** + * Array of domain checkpoint names for the given domain. With the option to pass flags. + * + * This is a helper function, internally, call to listAllCheckpoints(flags), and it only get the names. + * @param flags {@link CheckpointListFlags} + * @return Array of names, or null if an error + * @throws LibvirtException + */ + public String[] checkpointListNames(final int flags) throws LibvirtException { + DomainCheckpoint[] checkpoints = listAllCheckpoints(flags); + if(checkpoints.length > 0) { + String[] names = new String[checkpoints.length]; + for(int i = 0; i < checkpoints.length; i++) { + names[i] = checkpoints[i].getName(); + } + return names; + } + return Library.NO_STRINGS; + } + + /** + * Array of domain checkpoint names for the given domain. + *

+ * This is just a convenience method, it has the same effect + * as calling {@code checkpointListNames(0);}. + * + * @see #checkpointListNames(int) + * @return The list of names, or null if an error + * @throws LibvirtException + */ + public String[] checkpointListNames() throws LibvirtException { + return checkpointListNames(0); + } + /** * Creates a new snapshot of a domain based on the snapshot xml contained in * xmlDesc. diff --git a/src/main/java/org/libvirt/DomainCheckpoint.java b/src/main/java/org/libvirt/DomainCheckpoint.java new file mode 100644 index 0000000..ecf7ac2 --- /dev/null +++ b/src/main/java/org/libvirt/DomainCheckpoint.java @@ -0,0 +1,252 @@ +package org.libvirt; + +import org.libvirt.jna.DomainCheckpointPointer; + +import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; + +import static org.libvirt.Library.libvirt; + +import org.libvirt.Domain.CheckpointListFlags; + +import com.sun.jna.Native; + + +import static org.libvirt.ErrorHandler.processError; + +public class DomainCheckpoint { + + private static int bit(final int i) { + return 1 << i; + } + + public static final class CheckpointDeleteFlags { + /** + * Also delete children (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int CHILDREN = bit(0); + + /** + * Delete just metadata (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int METADATA_ONLY = bit(1); + + /** + * Delete just children (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int CHILDREN_ONLY = bit(2); + } + + public static final class XMLFlags { + /** Include sensitive data (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int SECURE = bit(0); + + /** Supress subelement (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int NO_DOMAIN = bit(1); + + /** Include dynamic per- size (Since: 5.6.0) + * + * @see + * Libvirt Documentation + */ + public static final int XML_SIZE = bit(2); + } + + /** + * the native virDomainCheckpointPtr. + */ + DomainCheckpointPointer vdcp; + + /** + * The Connect Object that represents the Hypervisor of this Domain Checkpoint + */ + private final Connect virConnect; + + + /** + * Constructs a DomainCheckpoint object from a known native DomainCheckpointPointer, and a + * Connect object. + * + * @param virConnect + * the Domain's hypervisor + * @param vdcp + * the native virDomainCheckpointPtr + */ + public DomainCheckpoint(final Connect virConnect, + final DomainCheckpointPointer vdcp) { + this.vdcp = vdcp; + this.virConnect = virConnect; + } + + /** + * Delete the domain checkpoint + * + * @see Libvirt + * Documentation + * @param flags see {@link CheckpointDeleteFlags} + * controls the deletion + * @return ignore (always 0) + * @throws LibvirtException + */ + public int delete(final int flags) throws LibvirtException { + int success = 0; + if (vdcp != null) { + success = processError(libvirt.virDomainCheckpointDelete(vdcp, flags)); + } + + return success; + } + + @Override + protected void finalize() throws LibvirtException { + free(); + } + + /** + * Frees this domaincheckpoint object. The running instance is kept alive. The data + * structure is freed and should not be used thereafter. + * + * @throws LibvirtException + * @return number of references left (>= 0) + */ + public int free() throws LibvirtException { + int success = 0; + if (vdcp != null) { + success = processError(libvirt.virDomainCheckpointFree(vdcp)); + vdcp = null; + } + + return success; + } + + /** + * Fetches an XML document describing attributes of the domain checkpoint, without + * security-sensitive data. + * + * @see + * Libvirt Documentation + * @return the XML document + * @throws org.libvirt.LibvirtException + */ + public String getXMLDesc() throws LibvirtException { + return getXMLDesc(0); + } + + /** + * Fetches an XML document describing attributes of the domain checkpoint. + * + * @see + * Libvirt Documentation + * @param flags see {@link XMLFlags} + * controls the information + * @return the XML document + * @throws org.libvirt.LibvirtException + */ + public String getXMLDesc(final int flags) throws LibvirtException { + return processError(libvirt.virDomainCheckpointGetXMLDesc(vdcp, flags)).toString(); + } + + /** + * Get the public name for that checkpoint + * + * @return the name, null if there is no name + * @throws LibvirtException + */ + public String getName() throws LibvirtException { + return processError(libvirt.virDomainCheckpointGetName(vdcp)); + } + + /** + * Array of domain checkpoints children for the given domain checkpoint. + * + * @see Libvirt + * Documentation + * @param flags + * flags for list the checkpoints, see the {@link CheckpointListFlags} for the flag options + * @return Array with children checkpoints of the given domain checkpoint + * @throws LibvirtException + */ + public DomainCheckpoint[] listAllChildren(int flags) throws LibvirtException { + PointerByReference checkpoints = new PointerByReference(); + int count = libvirt.virDomainCheckpointListAllChildren(vdcp, checkpoints, flags); + if (checkpoints.getValue() == null) { + if (count != 0) { + processError(count); + throw new IllegalStateException("virDomainListAllCheckpoints returned " + count); + } + return new DomainCheckpoint[0]; + } + DomainCheckpoint[] result = new DomainCheckpoint[count]; + try { + if (count < 0) { + processError(count); + throw new IllegalStateException("virDomainListAllCheckpoints returned " + count); + } + + Pointer arrayPtr = checkpoints.getValue(); + for (int i = 0; i < count; i++) { + Pointer p = arrayPtr.getPointer((long) i * Native.POINTER_SIZE); + result[i] = new DomainCheckpoint(virConnect, new DomainCheckpointPointer(p)); + } + + return result; + } finally { + Library.free(checkpoints.getValue()); + } + } + + /** + * Get the parent checkpoint for checkpoint, if any. + * + * @see Libvirt + * Documentation + * @param flags + * extra flags + * @return a domain checkpoint or null if the given domain checkpoint is root + * @throws LibvirtException + */ + public DomainCheckpoint getParent(int flags) throws LibvirtException { + DomainCheckpointPointer parent = libvirt.virDomainCheckpointGetParent(vdcp, flags); + if(parent == null) + return null; + return new DomainCheckpoint(virConnect, parent); + } + + /** + * Get the parent checkpoint for checkpoint, if any. + * + * This is just a convenience method, it has the same effect + * as calling {@code getParent(0);}. + * + * @see #getParent(int) + * @see Libvirt + * Documentation + * @return a domain checkpoint or null if the given domain checkpoint is root + * @throws LibvirtException + */ + public DomainCheckpoint getParent() throws LibvirtException { + return getParent(0); + } + +} diff --git a/src/main/java/org/libvirt/jna/DomainCheckpointPointer.java b/src/main/java/org/libvirt/jna/DomainCheckpointPointer.java new file mode 100644 index 0000000..10115bd --- /dev/null +++ b/src/main/java/org/libvirt/jna/DomainCheckpointPointer.java @@ -0,0 +1,18 @@ +package org.libvirt.jna; + +import com.sun.jna.Pointer; +import com.sun.jna.PointerType; + +/** + * Pointer class to provide type safety to the jna interface. + */ +public class DomainCheckpointPointer extends PointerType { + + public DomainCheckpointPointer() { + } + + public DomainCheckpointPointer(Pointer p) { + super(p); + } +} + diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 688bacc..05473f5 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -635,6 +635,31 @@ int virStreamSendAll(StreamPointer virStreamPtr, int virStreamRecvAll(StreamPointer virStreamPtr, Libvirt.VirStreamSinkFunc handler, Pointer opaque); + //DomainCheckpoint Methods + String virDomainCheckpointGetName(DomainCheckpointPointer virDomainCheckpointPtr); + DomainPointer virDomainCheckpointGetDomain(DomainCheckpointPointer virDomainCheckpointPtr); + ConnectionPointer virDomainCheckpointGetConnect(DomainCheckpointPointer checkpoint); + DomainCheckpointPointer virDomainCheckpointCreateXML(DomainPointer virDomainPtr, + String xmlDesc, int flags); + CString virDomainCheckpointGetXMLDesc(DomainCheckpointPointer virDomainCheckpointPtr, + int flags); + int virDomainListAllCheckpoints(DomainPointer virDomainPtr, + PointerByReference virDomainCheckpointsPtr, + int flags); + int virDomainCheckpointListAllChildren(DomainCheckpointPointer virDomainCheckpointPtr, + PointerByReference virDomainCheckpointChildrenPtr, + int flags); + DomainCheckpointPointer virDomainCheckpointLookupByName(DomainPointer virDomainPtr, + String name, int flags); + DomainCheckpointPointer virDomainCheckpointGetParent(DomainCheckpointPointer virDomainCheckpointPtr, + int flags); + int virDomainCheckpointDelete(DomainCheckpointPointer virDomainCheckpointPtr, + int flags); + + int virDomainCheckpointRef(DomainCheckpointPointer checkpoint); + + int virDomainCheckpointFree(DomainCheckpointPointer virDomainCheckpointPtr); + //DomainSnapshot Methods DomainSnapshotPointer virDomainSnapshotCreateXML(DomainPointer virDomainPtr, String xmlDesc, int flags); diff --git a/src/test/java/org/libvirt/TestJavaBindings.java b/src/test/java/org/libvirt/TestJavaBindings.java index 49d5a6f..679dce5 100644 --- a/src/test/java/org/libvirt/TestJavaBindings.java +++ b/src/test/java/org/libvirt/TestJavaBindings.java @@ -1,5 +1,6 @@ package org.libvirt; +import org.libvirt.Domain.CheckpointListFlags; import org.libvirt.event.*; import java.nio.ByteBuffer; @@ -410,4 +411,175 @@ public void testDomainInterfaceAddresses() throws LibvirtException { dom.undefine(); } } + + /** + * Helper function to create test domains + * @param domainName - Domain name + * @return Domain created + * @throws LibvirtException + */ + private Domain createDomainToCheckpointTest(String domainName) throws LibvirtException{ + String domainXML = "\n" + + " " + domainName + "\n" + + " 512\n" + + " 1\n" + + " \n" + + " hvm\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + Domain domain = conn.domainDefineXML(domainXML); + return domain; + } + + /** + * Check if throw an error when try to create a checkpoint in a inactive domain + * @throws LibvirtException + */ + public void testDomainCheckpointCreateThrowError() throws LibvirtException { + Domain domain = createDomainToCheckpointTest("test-vm-checkpoint-create-throw-error"); + String domainCheckpointXML = "\n" + + "\n" + + " test-checkpoint-create-1\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; + LibvirtException virException = null; + try { + domain.checkpointCreateXML(domainCheckpointXML, 0); + fail("Exception should be raised because the checkpoint can not perform in a stopped domain"); + } catch(LibvirtException e) { + virException = e; + } + assertNotNull(virException); + } + + /** + * Check methods to create and destroy checkpoints of a domain + * @throws LibvirtException + */ + public void testDomainCheckpointCreateAndDestroy() throws LibvirtException { + Domain domain = createDomainToCheckpointTest("test-vm-checkpoint-create"); + domain.create(); + assertEquals("The virtual machine should not have checkpoints", 0, domain.listAllCheckpoints(0).length); + String domainCheckpointXML = "\n" + + "\n" + + " test-checkpoint-create-1\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; + DomainCheckpoint domainCheckpoint1 = domain.checkpointCreateXML(domainCheckpointXML, 0); + + assertEquals("The checkpoint was not created", 1, domain.listAllCheckpoints(0).length); + domainCheckpointXML = "\n" + + "\n" + + " test-checkpoint-create-2\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; + DomainCheckpoint domainCheckpoint2 = domain.checkpointCreateXML(domainCheckpointXML, 0); + assertEquals("The second checkpoint was not created", 2, domain.listAllCheckpoints(0).length); + domainCheckpoint2.delete(DomainCheckpoint.CheckpointDeleteFlags.CHILDREN); + assertEquals("The checkpoint 2 was not deleted", 1, domain.listAllCheckpoints(0).length); + domainCheckpoint1.delete(DomainCheckpoint.CheckpointDeleteFlags.CHILDREN); + assertEquals("The checkpoint 1 was not deleted", 0, domain.listAllCheckpoints(0).length); + } + + /** + * Check methods inside DomainCheckpoint class, like getName, getXMLDesc,... + * @throws LibvirtException + */ + public void testDomainCheckpointMethods() throws LibvirtException { + Domain domain = createDomainToCheckpointTest("test-vm-checkpoint-methods"); + domain.create(); + String domainCheckpointXML = "\n" + + "\n" + + " test-checkpoint-methods-1\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; + DomainCheckpoint domainCheckpoint = domain.checkpointCreateXML(domainCheckpointXML, 0); + assertEquals("The names should match", "test-checkpoint-methods-1", domainCheckpoint.getName()); + + + String domainCheckpointXMLDesc = domainCheckpoint.getXMLDesc(0); + assertTrue("The XML should contain the tag ", domainCheckpointXMLDesc.contains("")); + assertTrue("The XML should contain the name of checkpoint", domainCheckpointXMLDesc.contains("test-checkpoint-methods-1")); + assertTrue("The XML should contain one of disks to perform the checkpoint", domainCheckpointXMLDesc.contains("vda")); + } + + /** + * Check methods with hierarchy, like listAllChildren, getParent, etc. + * @throws LibvirtException + */ + public void testDomainCheckpointHierarchy() throws LibvirtException { + int NUM_CHECKPOINTS = 10; // Should be bigger than 2 + Domain domain = createDomainToCheckpointTest("test-vm-checkpoint-testDomainCheckpointHierarchy"); + domain.create(); + DomainCheckpoint[] testCheckpoints = new DomainCheckpoint[NUM_CHECKPOINTS]; + String baseCheckpointName = "test-checkpoint-"; + for(int i = 0; i < NUM_CHECKPOINTS; i++) { + String domainCheckpointXML = "\n" + + " " + baseCheckpointName + i + " \n"; // We avoid disks subelement to write less code + testCheckpoints[i] = domain.checkpointCreateXML(domainCheckpointXML, 0); + } + + // Test the lookup function + DomainCheckpoint checkpointLookedup = domain.checkpointLookupByName("test-checkpoint-1"); + // Check if the parent is "test-checkpoint-0" + assertEquals(testCheckpoints[0].getName(), checkpointLookedup.getParent(0).getName()); + + + DomainCheckpoint checkpointNotCreated = domain.checkpointLookupByName("not-created-checkpoint"); + assertNull(checkpointNotCreated); + + // Get all checkpoints in topological order + DomainCheckpoint[] domainCheckpoints = domain.listAllCheckpoints(CheckpointListFlags.TOPOLOGICAL); + assertEquals("One checkpoint was not created", NUM_CHECKPOINTS, domainCheckpoints.length); + // The checkpoints order should be the same. + for (int i = 0; i < NUM_CHECKPOINTS; i++) { + assertEquals("The created checkpoints order should be the same - " + i, testCheckpoints[i].getName(), domainCheckpoints[i].getName()); + } + assertNull(testCheckpoints[0].getParent(0)); + for (int i = 1; i < NUM_CHECKPOINTS; i++) { + assertEquals(domainCheckpoints[i-1].getName(), domainCheckpoints[i].getParent(0).getName()); + } + + // Check checkpointListNames function + String[] checkpointNames = domain.checkpointListNames(CheckpointListFlags.TOPOLOGICAL); + assertEquals("One checkpoint was not created", NUM_CHECKPOINTS, checkpointNames.length); + // The checkpoints order should be the same. + for (int i = 0; i < NUM_CHECKPOINTS; i++) { + assertEquals("The created checkpoints order should be the same - " + i, testCheckpoints[i].getName(), checkpointNames[i]); + } + + // Check listAllChildren function + DomainCheckpoint[] childrenFromFirst = domainCheckpoints[0].listAllChildren(CheckpointListFlags.DESCENDANTS); + assertEquals("One checkpoint was not created", NUM_CHECKPOINTS - 1, childrenFromFirst.length); + for(int i = 1; i < NUM_CHECKPOINTS; i++) { + assertEquals(childrenFromFirst[i-1].getName(), domainCheckpoints[i].getName()); + } + } } From 502125b4fb80a13a10054ec1fac854f4c12d68cf Mon Sep 17 00:00:00 2001 From: Francisco Manuel Garcia Botella Date: Tue, 2 Sep 2025 16:26:40 +0200 Subject: [PATCH 13/14] Add DomainBackupBegin and DomainGetJobStats bindings Added tests to these bindings. Signed-off-by: Francisco Manuel Garcia Botella --- src/main/java/org/libvirt/Domain.java | 211 ++++++++++++++++-- .../java/org/libvirt/DomainCheckpoint.java | 26 +-- .../libvirt/jna/DomainCheckpointPointer.java | 2 +- src/main/java/org/libvirt/jna/Libvirt.java | 4 +- .../org/libvirt/jna/virTypedParameter.java | 7 +- .../java/org/libvirt/TestJavaBindings.java | 62 ++++- 6 files changed, 279 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index bfd647a..4acd6fe 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -58,6 +58,132 @@ private static int bit(final int i) { * TODO: get generated constants from libvirt */ + public static final class JobOperation { + /** + * @see + * Libvirt Documentation + */ + public static final int UNKNOWN = 0; + /** + * @see + * Libvirt Documentation + */ + public static final int START = 1; + + /** + * @see + * Libvirt Documentation + */ + public static final int SAVE = 2; + /** + * @see + * Libvirt Documentation + */ + public static final int RESTORE = 3; + + /** + * @see + * Libvirt Documentation + */ + public static final int MIGRATION_IN = 4; + + /** + * @see + * Libvirt Documentation + */ + public static final int MIGRATION_OUT = 5; + /** + * @see + * Libvirt Documentation + */ + public static final int SNAPSHOT = 6; + + /** + * @see + * Libvirt Documentation + */ + public static final int SNAPSHOT_REVERT = 7; + + /** + * @see + * Libvirt Documentation + */ + public static final int DUMP = 8; + + /** + * @see + * Libvirt Documentation + */ + public static final int BACKUP = 9; + + /** + * @see + * Libvirt Documentation + */ + public static final int SNAPSHOT_DELETE = 10; + /** + * @see + * Libvirt Documentation + */ + public static final int LAST = 11; + } + + public static final class BlockJobType { + /** + * Placeholder + * + * @see + * Libvirt Documentation + */ + public static int UNKNOWN = 0; + + /** + * Block Pull (virDomainBlockPull, or virDomainBlockRebase without flags), job ends on completion + * + * @see + * Libvirt Documentation + */ + public static int PULL = 1; + + /** + * Block Copy (virDomainBlockCopy, or virDomainBlockRebase with flags), job exists as long as mirroring is active + * + * @see + * Libvirt Documentation + */ + public static int COPY = 2; + + /** + * Block Commit (virDomainBlockCommit without flags), job ends on completion + * + * @see + * Libvirt Documentation + */ + public static int COMMIT = 3; + + /** + * Active Block Commit (virDomainBlockCommit with flags), job exists as long as sync is active + * + * @see + * Libvirt Documentation + */ + public static int ACTIVE_COMMIT = 4; + + /** + * Backup (virDomainBackupBegin) + * + * @see + * Libvirt Documentation + */ + public static int BACKUP = 5; + + /** + * @see + * Libvirt Documentation + */ + public static int LAST = 6; + } + public static final class BlockCommitFlags { /** NULL base means next backing file, not whole chain */ public static int SHALLOW = bit(0); @@ -521,11 +647,39 @@ public static final class RebootFlags { /** Use paravirt guest control */ public static final int PARAVIRT = bit(4); } - + + public static final class DomainBackupBeginFlags { + /** + * reuse separately provided images + * + * @see + * Libvirt Documentation + */ + public static final int REUSE_EXTERNAL = bit(0); + } + + public static final class DomainGetJobStatsFlags { + /** + * return stats of a recently completed job + * + * @see + * Libvirt Documentation + */ + public static final int COMPLETED = bit(0); + + /** + * don't remove completed stats when reading them + * + * @see + * Libvirt Documentation + */ + public static final int KEEP_COMPLETED = bit(1); + } + public static final class CheckpointCreateFlags { /** Restore or alter metadata (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ @@ -533,7 +687,7 @@ public static final class CheckpointCreateFlags { /** use guest agent to quiesce all mounted file * systems within the domain (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ @@ -541,7 +695,7 @@ public static final class CheckpointCreateFlags { /** validate disk data state when redefining * a checkpoint (Since: 6.10.0) - * + * * @see * Libvirt Documentation */ @@ -552,7 +706,7 @@ public static final class CheckpointListFlags { /** List all descendants, not just children, when * listing a checkpoint (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ @@ -560,7 +714,7 @@ public static final class CheckpointListFlags { /** Filter by checkpoints with no parents, when * listing a domain (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ @@ -568,21 +722,21 @@ public static final class CheckpointListFlags { /** Ensure parents occur before children in * the resulting list (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ public static final int TOPOLOGICAL = bit(1); /** Filter by checkpoints with no children (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ public static final int LEAVES = bit(2); /** Filter by checkpoints that have children (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ @@ -845,6 +999,35 @@ public void attachDeviceFlags(final String xmlDesc, final int flags) processError(libvirt.virDomainAttachDeviceFlags(vdp, xmlDesc, flags)); } + /** + * Start a point-in-time backup job for the specified disks of a running domain. + * + * @see + * Libvirt Documentation + * @param backupXML contains details about the backup in the top-level element + * @param checkpointXML description of a checkpoint to create or null + * @param flags the an OR'ed set of {@link DomainBackupBeginFlags} + * @throws LibvirtException + */ + public void backupBegin(final String backupXML, final String checkpointXML, int flags) + throws LibvirtException { + processError(libvirt.virDomainBackupBegin(vdp, backupXML, checkpointXML, flags)); + } + + /** + * Queries the configuration of the active backup job. + * @see + Libvirt Documentation + * @param flags extra flags; not used yet, so callers should always pass 0 + * @returnthe XML document + * @throws LibvirtException + */ + public String getBackupXMLDesc(final int flags) throws LibvirtException { + CString result = libvirt.virDomainBackupGetXMLDesc(vdp, flags); + processError(result); + return result.toString(); + } + /** * This function migrates domain's live block device (disk) to another * block device. @@ -2459,11 +2642,11 @@ public DomainCheckpoint checkpointCreateXML(final String xmlDesc) /** * Array of domain checkpoints for the given domain. - * - * @see Libvirt * Documentation - * + * * @param flags * flags for list the checkpoint, see the {@link CheckpointListFlags} for the flag options * @return Array with domain checkpoints of the given domain @@ -2479,12 +2662,12 @@ public DomainCheckpoint[] listAllCheckpoints(int flags) throws LibvirtException } return new DomainCheckpoint[0]; } - + try { if (count < 0) { processError(count); throw new IllegalStateException("virDomainListAllCheckpoints returned " + count); - } + } DomainCheckpoint[] result = new DomainCheckpoint[count]; Pointer arrayPtr = checkpoints.getValue(); for (int i = 0; i < count; i++) { diff --git a/src/main/java/org/libvirt/DomainCheckpoint.java b/src/main/java/org/libvirt/DomainCheckpoint.java index ecf7ac2..708ae88 100644 --- a/src/main/java/org/libvirt/DomainCheckpoint.java +++ b/src/main/java/org/libvirt/DomainCheckpoint.java @@ -23,7 +23,7 @@ private static int bit(final int i) { public static final class CheckpointDeleteFlags { /** * Also delete children (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ @@ -31,7 +31,7 @@ public static final class CheckpointDeleteFlags { /** * Delete just metadata (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ @@ -39,7 +39,7 @@ public static final class CheckpointDeleteFlags { /** * Delete just children (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ @@ -48,25 +48,25 @@ public static final class CheckpointDeleteFlags { public static final class XMLFlags { /** Include sensitive data (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ public static final int SECURE = bit(0); /** Supress subelement (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ public static final int NO_DOMAIN = bit(1); /** Include dynamic per- size (Since: 5.6.0) - * + * * @see * Libvirt Documentation */ - public static final int XML_SIZE = bit(2); + public static final int XML_SIZE = bit(2); } /** @@ -176,8 +176,8 @@ public String getName() throws LibvirtException { /** * Array of domain checkpoints children for the given domain checkpoint. - * - * @see Libvirt * Documentation * @param flags @@ -200,8 +200,8 @@ public DomainCheckpoint[] listAllChildren(int flags) throws LibvirtException { if (count < 0) { processError(count); throw new IllegalStateException("virDomainListAllCheckpoints returned " + count); - } - + } + Pointer arrayPtr = checkpoints.getValue(); for (int i = 0; i < count; i++) { Pointer p = arrayPtr.getPointer((long) i * Native.POINTER_SIZE); @@ -216,7 +216,7 @@ public DomainCheckpoint[] listAllChildren(int flags) throws LibvirtException { /** * Get the parent checkpoint for checkpoint, if any. - * + * * @see Libvirt * Documentation @@ -234,7 +234,7 @@ public DomainCheckpoint getParent(int flags) throws LibvirtException { /** * Get the parent checkpoint for checkpoint, if any. - * + * * This is just a convenience method, it has the same effect * as calling {@code getParent(0);}. * diff --git a/src/main/java/org/libvirt/jna/DomainCheckpointPointer.java b/src/main/java/org/libvirt/jna/DomainCheckpointPointer.java index 10115bd..2716e80 100644 --- a/src/main/java/org/libvirt/jna/DomainCheckpointPointer.java +++ b/src/main/java/org/libvirt/jna/DomainCheckpointPointer.java @@ -7,7 +7,7 @@ * Pointer class to provide type safety to the jna interface. */ public class DomainCheckpointPointer extends PointerType { - + public DomainCheckpointPointer() { } diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 05473f5..698fbad 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -324,6 +324,8 @@ int virGetVersion(LongByReference libVer, String type, int virDomainAttachDevice(DomainPointer virDomainPtr, String deviceXML); int virDomainAttachDeviceFlags(DomainPointer virDomainPtr, String deviceXML, int flags); + int virDomainBackupBegin(DomainPointer virDomainPtr, String backupXML, String checkpointXML, int flags); + CString virDomainBackupGetXMLDesc(DomainPointer virDomainPtr, int flags); int virDomainBlockCommit(DomainPointer virDomainPtr, String disk, String base, String top, long bandwidth, int flags); int virDomainBlockCopy(DomainPointer virDomainPtr, String disk, @@ -358,7 +360,7 @@ int virDomainGetBlockInfo(DomainPointer virDomainPtr, String path, int virDomainGetID(DomainPointer virDomainPtr); int virDomainGetInfo(DomainPointer virDomainPtr, virDomainInfo vInfo); int virDomainGetJobInfo(DomainPointer virDomainPtr, virDomainJobInfo vInfo); - int virDomainGetJobStats(DomainPointer virDomainPt, IntByReference type, PointerByReference params, + int virDomainGetJobStats(DomainPointer virDomainPtr, IntByReference type, PointerByReference params, IntByReference nparams, int flags); NativeLong virDomainGetMaxMemory(DomainPointer virDomainPtr); int virDomainGetMaxVcpus(DomainPointer virDomainPtr); diff --git a/src/main/java/org/libvirt/jna/virTypedParameter.java b/src/main/java/org/libvirt/jna/virTypedParameter.java index 00b2ded..6a5fd78 100644 --- a/src/main/java/org/libvirt/jna/virTypedParameter.java +++ b/src/main/java/org/libvirt/jna/virTypedParameter.java @@ -25,11 +25,12 @@ public class virTypedParameter extends Structure { public int type; public virTypedParameterValue value; - public virTypedParameter() { + public virTypedParameter(){ + super(); } - public virTypedParameter(Pointer ptr) { - super(ptr); + public virTypedParameter(Pointer p) { + super(p); } @Override diff --git a/src/test/java/org/libvirt/TestJavaBindings.java b/src/test/java/org/libvirt/TestJavaBindings.java index 679dce5..5fa2fb2 100644 --- a/src/test/java/org/libvirt/TestJavaBindings.java +++ b/src/test/java/org/libvirt/TestJavaBindings.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.regex.Pattern; @@ -469,7 +470,7 @@ public void testDomainCheckpointCreateThrowError() throws LibvirtException { } assertNotNull(virException); } - + /** * Check methods to create and destroy checkpoints of a domain * @throws LibvirtException @@ -582,4 +583,63 @@ public void testDomainCheckpointHierarchy() throws LibvirtException { assertEquals(childrenFromFirst[i-1].getName(), domainCheckpoints[i].getName()); } } + + public void testDomainBackupBegin() throws LibvirtException { + /** + * The driver test:///default is not compatible with virBackupBegin function. + * Discomment the test and put your own values and run. + */ + // String connectionURI = "qemu+ssh://root@fgar-libvirt/system"; + // String domainName = "deb12-1"; + // String checkpointName = "test-backup-begin-checkpoint"; + + /** + * In this test: + * - uses your local connection to search the domain. + * - Init backup of given domain. + * - Check if created correctly. + * - Delete the created checkpoint previously. + */ + + // Connect connToThisTest = new Connect(connectionURI, false); + + + // Domain domain = connToThisTest.domainLookupByName(domainName); + // assertEquals("The test domain should not have any domain checkpoint", 0, domain.listAllCheckpoints(0).length); + + // String backupXML = "\n" + // + // " \n" + // + // " \n" + // + // " \n" + // + // " \n" + // + // " \n" + // + // " \n" + // + // " \n" + // + // " \n" + // + // " \n" + // + // ""; + + + // String checkpointXML = "\n" + + // " " + checkpointName + "\n" + + // " \n" + + // " \n" + + // " \n" + + // " \n" + + // "\n"; + // domain.backupBegin(backupXML, checkpointXML, 0); + // DomainCheckpoint domainCheckpoint = domain.checkpointLookupByName(checkpointName); + // assertEquals(checkpointName, domainCheckpoint.getName()); + // try { + // Thread.sleep(2000); + // } catch (InterruptedException e) { + // e.printStackTrace(); + // } + // Map jobStats = domain.getJobStats(0); + // assertTrue("The jobStats should have the key 'operation'", jobStats.containsKey("operation")); + // assertEquals("The job type should be backup", Domain.JobOperation.BACKUP +"", jobStats.get("operation").getValueAsString()); + // domain.abortJob(); + // domainCheckpoint.delete(DomainCheckpoint.CheckpointDeleteFlags.CHILDREN); + // assertEquals("The checkpoint should be removed", 0, domain.listAllCheckpoints(0).length); + } } From 2ceed90106b11926c23a0dbbd33455f54d079654 Mon Sep 17 00:00:00 2001 From: Pavel Hrdina Date: Mon, 8 Dec 2025 18:22:57 +0100 Subject: [PATCH 14/14] ci: refresh with latest 'lcitool manifest' Removed old OSes: - Fedora 39, Fedora 40 Added new OSes: - AlmaLinux 10 - CentOS Stream 10 - Debian 13 - Fedora 42, Fedora 43 Signed-off-by: Pavel Hrdina --- .gitlab-ci.yml | 1 + ci/buildenv/almalinux-10.sh | 28 ++++++++++ ci/buildenv/almalinux-9.sh | 2 + ci/buildenv/centos-stream-10.sh | 26 ++++++++++ ci/buildenv/debian-13.sh | 26 ++++++++++ ci/buildenv/debian-sid.sh | 2 +- ci/buildenv/{fedora-39.sh => fedora-42.sh} | 0 ci/buildenv/{fedora-40.sh => fedora-43.sh} | 0 ci/buildenv/ubuntu-2204.sh | 2 +- ci/buildenv/ubuntu-2404.sh | 2 +- ci/containers/almalinux-10.Dockerfile | 30 +++++++++++ ci/containers/almalinux-9.Dockerfile | 4 +- ci/containers/centos-stream-10.Dockerfile | 28 ++++++++++ ci/containers/centos-stream-9.Dockerfile | 2 +- ci/containers/debian-12.Dockerfile | 2 +- ci/containers/debian-13.Dockerfile | 29 +++++++++++ ci/containers/debian-sid.Dockerfile | 4 +- ...ora-39.Dockerfile => fedora-42.Dockerfile} | 4 +- ...ora-40.Dockerfile => fedora-43.Dockerfile} | 4 +- ci/containers/fedora-rawhide.Dockerfile | 2 +- ci/containers/opensuse-leap-15.Dockerfile | 2 +- ci/containers/ubuntu-2204.Dockerfile | 4 +- ci/containers/ubuntu-2404.Dockerfile | 12 ++--- ci/gitlab.yml | 1 + ci/gitlab/build-templates.yml | 2 +- ci/gitlab/builds.yml | 51 ++++++++++++++++--- ci/gitlab/containers.yml | 29 +++++++++-- ci/manifest.yml | 18 ++++++- 28 files changed, 280 insertions(+), 37 deletions(-) create mode 100644 ci/buildenv/almalinux-10.sh create mode 100644 ci/buildenv/centos-stream-10.sh create mode 100644 ci/buildenv/debian-13.sh rename ci/buildenv/{fedora-39.sh => fedora-42.sh} (100%) rename ci/buildenv/{fedora-40.sh => fedora-43.sh} (100%) create mode 100644 ci/containers/almalinux-10.Dockerfile create mode 100644 ci/containers/centos-stream-10.Dockerfile create mode 100644 ci/containers/debian-13.Dockerfile rename ci/containers/{fedora-39.Dockerfile => fedora-42.Dockerfile} (92%) rename ci/containers/{fedora-40.Dockerfile => fedora-43.Dockerfile} (92%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4e8f60f..50a3471 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -53,6 +53,7 @@ website_job: - website variables: NAME: ubuntu-2204 + TARGET_BASE_IMAGE: docker.io/library/ubuntu:22.04 pages: stage: pages diff --git a/ci/buildenv/almalinux-10.sh b/ci/buildenv/almalinux-10.sh new file mode 100644 index 0000000..38b5861 --- /dev/null +++ b/ci/buildenv/almalinux-10.sh @@ -0,0 +1,28 @@ +# THIS FILE WAS AUTO-GENERATED +# +# $ lcitool manifest ci/manifest.yml +# +# https://gitlab.com/libvirt/libvirt-ci + +function install_buildenv() { + dnf update -y + dnf install 'dnf-command(config-manager)' -y + dnf config-manager --set-enabled -y crb + dnf install -y epel-release + dnf install almalinux-release-devel -y + dnf config-manager --set-enabled -y devel + dnf install -y \ + ant \ + ant-junit \ + ca-certificates \ + git \ + glibc-langpack-en \ + java-21-openjdk-headless \ + jna \ + junit \ + libvirt-devel \ + rpm-build + rpm -qa | sort > /packages.txt +} + +export LANG="en_US.UTF-8" diff --git a/ci/buildenv/almalinux-9.sh b/ci/buildenv/almalinux-9.sh index f4065ad..38b5861 100644 --- a/ci/buildenv/almalinux-9.sh +++ b/ci/buildenv/almalinux-9.sh @@ -9,6 +9,8 @@ function install_buildenv() { dnf install 'dnf-command(config-manager)' -y dnf config-manager --set-enabled -y crb dnf install -y epel-release + dnf install almalinux-release-devel -y + dnf config-manager --set-enabled -y devel dnf install -y \ ant \ ant-junit \ diff --git a/ci/buildenv/centos-stream-10.sh b/ci/buildenv/centos-stream-10.sh new file mode 100644 index 0000000..4ab6f19 --- /dev/null +++ b/ci/buildenv/centos-stream-10.sh @@ -0,0 +1,26 @@ +# THIS FILE WAS AUTO-GENERATED +# +# $ lcitool manifest ci/manifest.yml +# +# https://gitlab.com/libvirt/libvirt-ci + +function install_buildenv() { + dnf distro-sync -y + dnf install 'dnf-command(config-manager)' -y + dnf config-manager --set-enabled -y crb + dnf install -y epel-release + dnf install -y \ + ant \ + ant-junit \ + ca-certificates \ + git \ + glibc-langpack-en \ + java-21-openjdk-headless \ + jna \ + junit \ + libvirt-devel \ + rpm-build + rpm -qa | sort > /packages.txt +} + +export LANG="en_US.UTF-8" diff --git a/ci/buildenv/debian-13.sh b/ci/buildenv/debian-13.sh new file mode 100644 index 0000000..b294b6d --- /dev/null +++ b/ci/buildenv/debian-13.sh @@ -0,0 +1,26 @@ +# THIS FILE WAS AUTO-GENERATED +# +# $ lcitool manifest ci/manifest.yml +# +# https://gitlab.com/libvirt/libvirt-ci + +function install_buildenv() { + export DEBIAN_FRONTEND=noninteractive + apt-get update + apt-get dist-upgrade -y + apt-get install --no-install-recommends -y \ + ant \ + ant-optional \ + ca-certificates \ + git \ + junit \ + libjna-java \ + libvirt-dev \ + locales \ + openjdk-21-jdk-headless + sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen + dpkg-reconfigure locales + dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt +} + +export LANG="en_US.UTF-8" diff --git a/ci/buildenv/debian-sid.sh b/ci/buildenv/debian-sid.sh index d2f6a77..b294b6d 100644 --- a/ci/buildenv/debian-sid.sh +++ b/ci/buildenv/debian-sid.sh @@ -17,7 +17,7 @@ function install_buildenv() { libjna-java \ libvirt-dev \ locales \ - openjdk-17-jdk-headless + openjdk-21-jdk-headless sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen dpkg-reconfigure locales dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt diff --git a/ci/buildenv/fedora-39.sh b/ci/buildenv/fedora-42.sh similarity index 100% rename from ci/buildenv/fedora-39.sh rename to ci/buildenv/fedora-42.sh diff --git a/ci/buildenv/fedora-40.sh b/ci/buildenv/fedora-43.sh similarity index 100% rename from ci/buildenv/fedora-40.sh rename to ci/buildenv/fedora-43.sh diff --git a/ci/buildenv/ubuntu-2204.sh b/ci/buildenv/ubuntu-2204.sh index d2f6a77..b294b6d 100644 --- a/ci/buildenv/ubuntu-2204.sh +++ b/ci/buildenv/ubuntu-2204.sh @@ -17,7 +17,7 @@ function install_buildenv() { libjna-java \ libvirt-dev \ locales \ - openjdk-17-jdk-headless + openjdk-21-jdk-headless sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen dpkg-reconfigure locales dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt diff --git a/ci/buildenv/ubuntu-2404.sh b/ci/buildenv/ubuntu-2404.sh index a022f83..d2eb642 100644 --- a/ci/buildenv/ubuntu-2404.sh +++ b/ci/buildenv/ubuntu-2404.sh @@ -32,7 +32,7 @@ function install_buildenv() { make \ meson \ ninja-build \ - openjdk-17-jdk-headless \ + openjdk-21-jdk-headless \ perl-base \ pkgconf \ python3 \ diff --git a/ci/containers/almalinux-10.Dockerfile b/ci/containers/almalinux-10.Dockerfile new file mode 100644 index 0000000..4c138b6 --- /dev/null +++ b/ci/containers/almalinux-10.Dockerfile @@ -0,0 +1,30 @@ +# THIS FILE WAS AUTO-GENERATED +# +# $ lcitool manifest ci/manifest.yml +# +# https://gitlab.com/libvirt/libvirt-ci + +FROM docker.io/library/almalinux:10 + +RUN dnf update -y && \ + dnf install 'dnf-command(config-manager)' -y && \ + dnf config-manager --set-enabled -y crb && \ + dnf install -y epel-release && \ + dnf install almalinux-release-devel -y && \ + dnf config-manager --set-enabled -y devel && \ + dnf install -y \ + ant \ + ant-junit \ + ca-certificates \ + git \ + glibc-langpack-en \ + java-21-openjdk-headless \ + jna \ + junit \ + libvirt-devel \ + rpm-build && \ + dnf autoremove -y && \ + dnf clean all -y && \ + rpm -qa | sort > /packages.txt + +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/almalinux-9.Dockerfile b/ci/containers/almalinux-9.Dockerfile index 40db23b..a7843d0 100644 --- a/ci/containers/almalinux-9.Dockerfile +++ b/ci/containers/almalinux-9.Dockerfile @@ -10,6 +10,8 @@ RUN dnf update -y && \ dnf install 'dnf-command(config-manager)' -y && \ dnf config-manager --set-enabled -y crb && \ dnf install -y epel-release && \ + dnf install almalinux-release-devel -y && \ + dnf config-manager --set-enabled -y devel && \ dnf install -y \ ant \ ant-junit \ @@ -25,4 +27,4 @@ RUN dnf update -y && \ dnf clean all -y && \ rpm -qa | sort > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/centos-stream-10.Dockerfile b/ci/containers/centos-stream-10.Dockerfile new file mode 100644 index 0000000..c4a9060 --- /dev/null +++ b/ci/containers/centos-stream-10.Dockerfile @@ -0,0 +1,28 @@ +# THIS FILE WAS AUTO-GENERATED +# +# $ lcitool manifest ci/manifest.yml +# +# https://gitlab.com/libvirt/libvirt-ci + +FROM quay.io/centos/centos:stream10 + +RUN dnf distro-sync -y && \ + dnf install 'dnf-command(config-manager)' -y && \ + dnf config-manager --set-enabled -y crb && \ + dnf install -y epel-release && \ + dnf install -y \ + ant \ + ant-junit \ + ca-certificates \ + git \ + glibc-langpack-en \ + java-21-openjdk-headless \ + jna \ + junit \ + libvirt-devel \ + rpm-build && \ + dnf autoremove -y && \ + dnf clean all -y && \ + rpm -qa | sort > /packages.txt + +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/centos-stream-9.Dockerfile b/ci/containers/centos-stream-9.Dockerfile index c29ddfb..501aae6 100644 --- a/ci/containers/centos-stream-9.Dockerfile +++ b/ci/containers/centos-stream-9.Dockerfile @@ -26,4 +26,4 @@ RUN dnf distro-sync -y && \ dnf clean all -y && \ rpm -qa | sort > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/debian-12.Dockerfile b/ci/containers/debian-12.Dockerfile index ec45fb8..c7477ab 100644 --- a/ci/containers/debian-12.Dockerfile +++ b/ci/containers/debian-12.Dockerfile @@ -26,4 +26,4 @@ RUN export DEBIAN_FRONTEND=noninteractive && \ dpkg-reconfigure locales && \ dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/debian-13.Dockerfile b/ci/containers/debian-13.Dockerfile new file mode 100644 index 0000000..f895a9b --- /dev/null +++ b/ci/containers/debian-13.Dockerfile @@ -0,0 +1,29 @@ +# THIS FILE WAS AUTO-GENERATED +# +# $ lcitool manifest ci/manifest.yml +# +# https://gitlab.com/libvirt/libvirt-ci + +FROM docker.io/library/debian:13-slim + +RUN export DEBIAN_FRONTEND=noninteractive && \ + apt-get update && \ + apt-get install -y eatmydata && \ + eatmydata apt-get dist-upgrade -y && \ + eatmydata apt-get install --no-install-recommends -y \ + ant \ + ant-optional \ + ca-certificates \ + git \ + junit \ + libjna-java \ + libvirt-dev \ + locales \ + openjdk-21-jdk-headless && \ + eatmydata apt-get autoremove -y && \ + eatmydata apt-get autoclean -y && \ + sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \ + dpkg-reconfigure locales && \ + dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt + +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/debian-sid.Dockerfile b/ci/containers/debian-sid.Dockerfile index 03d2f57..9ec4042 100644 --- a/ci/containers/debian-sid.Dockerfile +++ b/ci/containers/debian-sid.Dockerfile @@ -19,11 +19,11 @@ RUN export DEBIAN_FRONTEND=noninteractive && \ libjna-java \ libvirt-dev \ locales \ - openjdk-17-jdk-headless && \ + openjdk-21-jdk-headless && \ eatmydata apt-get autoremove -y && \ eatmydata apt-get autoclean -y && \ sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \ dpkg-reconfigure locales && \ dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/fedora-39.Dockerfile b/ci/containers/fedora-42.Dockerfile similarity index 92% rename from ci/containers/fedora-39.Dockerfile rename to ci/containers/fedora-42.Dockerfile index afa350f..d19ea84 100644 --- a/ci/containers/fedora-39.Dockerfile +++ b/ci/containers/fedora-42.Dockerfile @@ -4,7 +4,7 @@ # # https://gitlab.com/libvirt/libvirt-ci -FROM registry.fedoraproject.org/fedora:39 +FROM registry.fedoraproject.org/fedora:42 RUN dnf install -y nosync && \ printf '#!/bin/sh\n\ @@ -32,4 +32,4 @@ exec "$@"\n' > /usr/bin/nosync && \ nosync dnf clean all -y && \ rpm -qa | sort > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/fedora-40.Dockerfile b/ci/containers/fedora-43.Dockerfile similarity index 92% rename from ci/containers/fedora-40.Dockerfile rename to ci/containers/fedora-43.Dockerfile index 5d8f9b4..1a32678 100644 --- a/ci/containers/fedora-40.Dockerfile +++ b/ci/containers/fedora-43.Dockerfile @@ -4,7 +4,7 @@ # # https://gitlab.com/libvirt/libvirt-ci -FROM registry.fedoraproject.org/fedora:40 +FROM registry.fedoraproject.org/fedora:43 RUN dnf install -y nosync && \ printf '#!/bin/sh\n\ @@ -32,4 +32,4 @@ exec "$@"\n' > /usr/bin/nosync && \ nosync dnf clean all -y && \ rpm -qa | sort > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/fedora-rawhide.Dockerfile b/ci/containers/fedora-rawhide.Dockerfile index fff03f4..1aa1d85 100644 --- a/ci/containers/fedora-rawhide.Dockerfile +++ b/ci/containers/fedora-rawhide.Dockerfile @@ -33,4 +33,4 @@ exec "$@"\n' > /usr/bin/nosync && \ nosync dnf clean all -y && \ rpm -qa | sort > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/opensuse-leap-15.Dockerfile b/ci/containers/opensuse-leap-15.Dockerfile index 535e449..a5c2dd0 100644 --- a/ci/containers/opensuse-leap-15.Dockerfile +++ b/ci/containers/opensuse-leap-15.Dockerfile @@ -22,4 +22,4 @@ RUN zypper update -y && \ zypper clean --all && \ rpm -qa | sort > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/ubuntu-2204.Dockerfile b/ci/containers/ubuntu-2204.Dockerfile index b0076c8..a6531cf 100644 --- a/ci/containers/ubuntu-2204.Dockerfile +++ b/ci/containers/ubuntu-2204.Dockerfile @@ -19,11 +19,11 @@ RUN export DEBIAN_FRONTEND=noninteractive && \ libjna-java \ libvirt-dev \ locales \ - openjdk-17-jdk-headless && \ + openjdk-21-jdk-headless && \ eatmydata apt-get autoremove -y && \ eatmydata apt-get autoclean -y && \ sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \ dpkg-reconfigure locales && \ dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt -ENV LANG "en_US.UTF-8" +ENV LANG="en_US.UTF-8" diff --git a/ci/containers/ubuntu-2404.Dockerfile b/ci/containers/ubuntu-2404.Dockerfile index 1509b9a..cbdb9a6 100644 --- a/ci/containers/ubuntu-2404.Dockerfile +++ b/ci/containers/ubuntu-2404.Dockerfile @@ -34,7 +34,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \ make \ meson \ ninja-build \ - openjdk-17-jdk-headless \ + openjdk-21-jdk-headless \ perl-base \ pkgconf \ python3 \ @@ -50,8 +50,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc -ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers" -ENV LANG "en_US.UTF-8" -ENV MAKE "/usr/bin/make" -ENV NINJA "/usr/bin/ninja" -ENV PYTHON "/usr/bin/python3" +ENV CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers" +ENV LANG="en_US.UTF-8" +ENV MAKE="/usr/bin/make" +ENV NINJA="/usr/bin/ninja" +ENV PYTHON="/usr/bin/python3" diff --git a/ci/gitlab.yml b/ci/gitlab.yml index 0daab12..0e6de9f 100644 --- a/ci/gitlab.yml +++ b/ci/gitlab.yml @@ -55,6 +55,7 @@ variables: RUN_UPSTREAM_NAMESPACE: libvirt + CONTAINER_UPSTREAM_NAMESPACE: libvirt FF_SCRIPT_SECTIONS: 1 diff --git a/ci/gitlab/build-templates.yml b/ci/gitlab/build-templates.yml index 5e6b28e..1eb7ccf 100644 --- a/ci/gitlab/build-templates.yml +++ b/ci/gitlab/build-templates.yml @@ -35,7 +35,7 @@ fi - cat /packages.txt variables: - IMAGE: $CI_REGISTRY/$RUN_UPSTREAM_NAMESPACE/libvirt-java/ci-$NAME:latest + IMAGE: $CI_REGISTRY/$CONTAINER_UPSTREAM_NAMESPACE/libvirt-java/ci-$NAME:latest rules: ### PUSH events diff --git a/ci/gitlab/builds.yml b/ci/gitlab/builds.yml index 0ed5fd0..c911807 100644 --- a/ci/gitlab/builds.yml +++ b/ci/gitlab/builds.yml @@ -19,6 +19,18 @@ x86_64-almalinux-9: TESTS: skip +x86_64-almalinux-10: + extends: .native_build_job + needs: + - job: x86_64-almalinux-10-container + optional: true + allow_failure: false + variables: + NAME: almalinux-10 + TARGET_BASE_IMAGE: docker.io/library/almalinux:10 + TESTS: skip + + x86_64-centos-stream-9: extends: .native_build_job needs: @@ -31,6 +43,18 @@ x86_64-centos-stream-9: TESTS: skip +x86_64-centos-stream-10: + extends: .native_build_job + needs: + - job: x86_64-centos-stream-10-container + optional: true + allow_failure: false + variables: + NAME: centos-stream-10 + TARGET_BASE_IMAGE: quay.io/centos/centos:stream10 + TESTS: skip + + x86_64-debian-12: extends: .native_build_job needs: @@ -42,6 +66,17 @@ x86_64-debian-12: TARGET_BASE_IMAGE: docker.io/library/debian:12-slim +x86_64-debian-13: + extends: .native_build_job + needs: + - job: x86_64-debian-13-container + optional: true + allow_failure: false + variables: + NAME: debian-13 + TARGET_BASE_IMAGE: docker.io/library/debian:13-slim + + x86_64-debian-sid: extends: .native_build_job needs: @@ -53,26 +88,26 @@ x86_64-debian-sid: TARGET_BASE_IMAGE: docker.io/library/debian:sid-slim -x86_64-fedora-39: +x86_64-fedora-42: extends: .native_build_job needs: - - job: x86_64-fedora-39-container + - job: x86_64-fedora-42-container optional: true allow_failure: false variables: - NAME: fedora-39 - TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:39 + NAME: fedora-42 + TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:42 -x86_64-fedora-40: +x86_64-fedora-43: extends: .native_build_job needs: - - job: x86_64-fedora-40-container + - job: x86_64-fedora-43-container optional: true allow_failure: false variables: - NAME: fedora-40 - TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:40 + NAME: fedora-43 + TARGET_BASE_IMAGE: registry.fedoraproject.org/fedora:43 x86_64-fedora-rawhide: diff --git a/ci/gitlab/containers.yml b/ci/gitlab/containers.yml index 81a9d9f..90693fa 100644 --- a/ci/gitlab/containers.yml +++ b/ci/gitlab/containers.yml @@ -14,6 +14,13 @@ x86_64-almalinux-9-container: NAME: almalinux-9 +x86_64-almalinux-10-container: + extends: .container_job + allow_failure: false + variables: + NAME: almalinux-10 + + x86_64-centos-stream-9-container: extends: .container_job allow_failure: false @@ -21,6 +28,13 @@ x86_64-centos-stream-9-container: NAME: centos-stream-9 +x86_64-centos-stream-10-container: + extends: .container_job + allow_failure: false + variables: + NAME: centos-stream-10 + + x86_64-debian-12-container: extends: .container_job allow_failure: false @@ -28,6 +42,13 @@ x86_64-debian-12-container: NAME: debian-12 +x86_64-debian-13-container: + extends: .container_job + allow_failure: false + variables: + NAME: debian-13 + + x86_64-debian-sid-container: extends: .container_job allow_failure: true @@ -35,18 +56,18 @@ x86_64-debian-sid-container: NAME: debian-sid -x86_64-fedora-39-container: +x86_64-fedora-42-container: extends: .container_job allow_failure: false variables: - NAME: fedora-39 + NAME: fedora-42 -x86_64-fedora-40-container: +x86_64-fedora-43-container: extends: .container_job allow_failure: false variables: - NAME: fedora-40 + NAME: fedora-43 x86_64-fedora-rawhide-container: diff --git a/ci/manifest.yml b/ci/manifest.yml index 09966a4..4243abc 100644 --- a/ci/manifest.yml +++ b/ci/manifest.yml @@ -13,19 +13,33 @@ targets: variables: TESTS: skip + almalinux-10: + jobs: + - arch: x86_64 + variables: + TESTS: skip + centos-stream-9: jobs: - arch: x86_64 variables: TESTS: skip + centos-stream-10: + jobs: + - arch: x86_64 + variables: + TESTS: skip + debian-12: x86_64 + debian-13: x86_64 + debian-sid: x86_64 - fedora-39: x86_64 + fedora-42: x86_64 - fedora-40: x86_64 + fedora-43: x86_64 fedora-rawhide: x86_64