diff --git a/chv.nix b/chv.nix new file mode 100644 index 0000000..37767c3 --- /dev/null +++ b/chv.nix @@ -0,0 +1,51 @@ +{ + # from flake inputs + craneLib, + # from nixpkgs + openssl, + pkg-config, + # other + cloud-hypervisor-src, + rustToolchain, +}: + +let + craneLib' = craneLib.overrideToolchain rustToolchain; + + commonArgs = { + src = craneLib'.cleanCargoSource cloud-hypervisor-src; + nativeBuildInputs = [ + pkg-config + ]; + buildInputs = [ + openssl + ]; + # Fix build. Reference: + # - https://github.com/sfackler/rust-openssl/issues/1430 + # - https://docs.rs/openssl/latest/openssl/ + OPENSSL_NO_VENDOR = true; + }; + + # Downloaded and compiled dependencies. + cargoArtifacts = craneLib'.buildDepsOnly ( + commonArgs + // { + pname = "cloud-hypervisor-deps"; + } + ); + + cargoPackageKvm = craneLib'.buildPackage ( + commonArgs + // { + inherit cargoArtifacts; + pname = "cloud-hypervisor"; + # Don't execute tests here. We want this in a dedicated step. + doCheck = false; + cargoExtraArgs = "--features kvm"; + } + ); +in +{ + default = cargoPackageKvm; + chvKvm = cargoPackageKvm; +} diff --git a/flake.lock b/flake.lock index 83936fc..9cf207b 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,38 @@ { "nodes": { + "cloud-hypervisor-src": { + "flake": false, + "locked": { + "lastModified": 1750081650, + "narHash": "sha256-yiGVMqRXDfCNxpfFDEKO2u9EK/YoUyzReKKYDYBGsSk=", + "owner": "cyberus-technology", + "repo": "cloud-hypervisor", + "rev": "50c6d063083907fde425aa8736eaa8bda1ae6236", + "type": "github" + }, + "original": { + "owner": "cyberus-technology", + "ref": "gardenlinux-dev", + "repo": "cloud-hypervisor", + "type": "github" + } + }, + "crane": { + "locked": { + "lastModified": 1748970125, + "narHash": "sha256-UDyigbDGv8fvs9aS95yzFfOKkEjx1LO3PL3DsKopohA=", + "owner": "ipetkov", + "repo": "crane", + "rev": "323b5746d89e04b22554b061522dfce9e4c49b18", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "ref": "master", + "repo": "crane", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -54,6 +87,25 @@ "type": "github" } }, + "libvirt-src": { + "flake": false, + "locked": { + "lastModified": 1748958520, + "narHash": "sha256-TttX5Xg8knE4V/pTwaOlcFTsZsCA7+U2a9LDb0HEHD8=", + "ref": "gardenlinux", + "rev": "595436ebf8f3a86480d2ad7463906f2cb2fabfa5", + "revCount": 52213, + "submodules": true, + "type": "git", + "url": "https://github.com/cyberus-technology/libvirt" + }, + "original": { + "ref": "gardenlinux", + "submodules": true, + "type": "git", + "url": "https://github.com/cyberus-technology/libvirt" + } + }, "nixpkgs": { "locked": { "lastModified": 1737299813, @@ -70,6 +122,22 @@ "type": "github" } }, + "nixpkgs-25-05": { + "locked": { + "lastModified": 1750005367, + "narHash": "sha256-h/aac1dGLhS3qpaD2aZt25NdKY7b+JT0ZIP2WuGsJMU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "6c64dabd3aa85e0c02ef1cdcb6e1213de64baee3", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, "pre-commit-hooks-nix": { "inputs": { "flake-compat": "flake-compat", @@ -94,9 +162,34 @@ }, "root": { "inputs": { + "cloud-hypervisor-src": "cloud-hypervisor-src", + "crane": "crane", "flake-utils": "flake-utils", + "libvirt-src": "libvirt-src", "nixpkgs": "nixpkgs", - "pre-commit-hooks-nix": "pre-commit-hooks-nix" + "nixpkgs-25-05": "nixpkgs-25-05", + "pre-commit-hooks-nix": "pre-commit-hooks-nix", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs-25-05" + ] + }, + "locked": { + "lastModified": 1750127910, + "narHash": "sha256-FIgEIS0RAlOyXGqoj/OufTfcKItYq668yPYL4SXdU0M=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "45418795a73b77b7726c62ce265d68cf541ffb49", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" } }, "systems": { diff --git a/flake.nix b/flake.nix index dc00fba..c55b9ec 100644 --- a/flake.nix +++ b/flake.nix @@ -2,11 +2,20 @@ description = "OpenStack Packages and Modules for NixOS"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-24.11"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + nixpkgs-25-05.url = "github:nixos/nixpkgs/nixos-25.05"; pre-commit-hooks-nix = { url = "github:cachix/pre-commit-hooks.nix"; inputs.nixpkgs.follows = "nixpkgs"; }; + # Nix tooling to build cloud-hypervisor. + crane.url = "github:ipetkov/crane/master"; + cloud-hypervisor-src.url = "github:cyberus-technology/cloud-hypervisor/gardenlinux-dev"; + cloud-hypervisor-src.flake = false; + rust-overlay.url = "github:oxalica/rust-overlay"; + rust-overlay.inputs.nixpkgs.follows = "nixpkgs-25-05"; + libvirt-src.url = "git+https://github.com/cyberus-technology/libvirt?ref=gardenlinux&submodules=1"; + libvirt-src.flake = false; }; outputs = @@ -14,14 +23,13 @@ self, nixpkgs, flake-utils, - pre-commit-hooks-nix, ... - }: + }@inputs: flake-utils.lib.eachSystem [ "x86_64-linux" ] ( system: let pkgs = import nixpkgs { inherit system; }; - pre-commit-hooks-run = pre-commit-hooks-nix.lib.${system}.run; + pre-commit-hooks-run = inputs.pre-commit-hooks-nix.lib.${system}.run; in rec { formatter = pkgs.nixfmt-rfc-style; @@ -44,11 +52,39 @@ }; }; - packages = import ./packages { inherit (pkgs) callPackage python3Packages; }; + packages = (import ./packages { inherit (pkgs) callPackage python3Packages; }) // { + cloud-hypervisor = + let + pkgs-25-05 = import inputs.nixpkgs-25-05 { inherit (pkgs) system; }; + rust-bin = (inputs.rust-overlay.lib.mkRustBin { }) pkgs-25-05; + artifacts = pkgs.callPackage ./chv.nix { + inherit (inputs) cloud-hypervisor-src; + craneLib = inputs.crane.mkLib pkgs-25-05; + rustToolchain = rust-bin.stable.latest.default; + }; + in + artifacts.default; + libvirt = pkgs.libvirt.overrideAttrs ({ + src = inputs.libvirt-src; + patches = + let + patchSrc = ./patches/libvirt; + in + (pkgs.lib.pipe patchSrc [ + builtins.readDir + builtins.attrNames + # To fully-qualified path. + (map (f: "${patchSrc}/${f}")) + ]); + }); + }; checks = import ./checks { inherit pkgs pre-commit-hooks-run; }; - nixosModules = import ./modules { openstackPkgs = packages; }; + nixosModules = import ./modules { + openstackPkgs = packages; + inherit self; + }; tests = import ./tests/default.nix { inherit pkgs nixosModules; diff --git a/modules/chv-sap.nix b/modules/chv-sap.nix new file mode 100644 index 0000000..f7082ea --- /dev/null +++ b/modules/chv-sap.nix @@ -0,0 +1,16 @@ +# Ensures libvirt and Cloud Hypervisor are set with the proper sources for SAP +# (for gardenlinux). + +# Function returning a NixOS Module +{ self }: + +# NixOS Module start +{ pkgs, ... }: +{ + virtualisation.libvirtd.package = pkgs.libvirt; + nixpkgs.overlays = [ + (prev: final: { + inherit (self.packages.${pkgs.system}) cloud-hypervisor; + }) + ]; +} diff --git a/modules/default.nix b/modules/default.nix index 396eaf8..0bf491d 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -1,4 +1,4 @@ -{ openstackPkgs }: +{ openstackPkgs, self }: { controllerModule = import ./controller/openstack-controller.nix { inherit (openstackPkgs) @@ -14,4 +14,6 @@ computeModule = import ./compute/compute.nix { inherit (openstackPkgs) neutron nova; }; testModules = import ./testing { }; + + chv-sap = import ./chv-sap.nix { inherit self; }; } diff --git a/patches/libvirt/0001-meson-patch-in-an-install-prefix-for-building-on-nix.patch b/patches/libvirt/0001-meson-patch-in-an-install-prefix-for-building-on-nix.patch new file mode 100644 index 0000000..9580f5c --- /dev/null +++ b/patches/libvirt/0001-meson-patch-in-an-install-prefix-for-building-on-nix.patch @@ -0,0 +1,471 @@ +From 98388f8f2619b18edc666d93d49ae3b484690993 Mon Sep 17 00:00:00 2001 +From: Stefan Kober +Date: Tue, 20 May 2025 10:29:35 +0200 +Subject: [PATCH] meson: patch in an install prefix for building on nix + +Used in the nixpkgs version of libvirt so that we can install things in +the nix store, but read them from the root filesystem. +--- + meson.build | 9 +++++++ + meson_options.txt | 2 ++ + src/ch/meson.build | 6 ++--- + src/interface/meson.build | 2 +- + src/libxl/meson.build | 18 +++++++------- + src/locking/meson.build | 8 +++---- + src/lxc/meson.build | 10 ++++---- + src/meson.build | 18 +++++++------- + src/network/meson.build | 14 +++++------ + src/node_device/meson.build | 2 +- + src/nwfilter/meson.build | 6 ++--- + src/nwfilter/xml/meson.build | 2 +- + src/qemu/meson.build | 40 +++++++++++++++---------------- + src/remote/meson.build | 10 ++++---- + src/secret/meson.build | 4 ++-- + src/security/apparmor/meson.build | 6 ++--- + src/storage/meson.build | 6 ++--- + tools/meson.build | 2 +- + tools/ssh-proxy/meson.build | 2 +- + 19 files changed, 89 insertions(+), 78 deletions(-) + +diff --git a/meson.build b/meson.build +index bb0436e072..65c9531dc4 100644 +--- a/meson.build ++++ b/meson.build +@@ -51,6 +51,8 @@ if host_machine.system() == 'windows' + conf.set('WINVER', '0x0600') # Win Vista / Server 2008 + endif + ++# patched in for nix ++install_prefix = get_option('install_prefix') + + # set various paths + +@@ -69,6 +71,13 @@ else + sysconfdir = prefix / get_option('sysconfdir') + endif + ++# nix: don't prefix the localstatedir; some things need to write to it, so it ++# can't be in the nix store, and that's what the prefix is. ++# We'll prefix things ourselves where needed ++localstatedir = get_option('localstatedir') ++# Same for sysconfidr ++sysconfdir = get_option('sysconfdir') ++ + # if --prefix is /usr, don't use /usr/var for localstatedir or /usr/etc for + # sysconfdir as this makes a lot of things break in testing situations + if prefix == '/usr' +diff --git a/meson_options.txt b/meson_options.txt +index 3dc3e8667b..49fbfce0bc 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -1,3 +1,5 @@ ++option('install_prefix', type: 'string', value: '', description: 'prefix for nix store installation') ++ + option('no_git', type: 'boolean', value: false, description: 'Disable git submodule update') + option('packager', type: 'string', value: '', description: 'Extra packager name') + option('packager_version', type: 'string', value: '', description: 'Extra packager version') +diff --git a/src/ch/meson.build b/src/ch/meson.build +index 0b4a5aeb49..45b00e6d48 100644 +--- a/src/ch/meson.build ++++ b/src/ch/meson.build +@@ -78,8 +78,8 @@ if conf.has('WITH_CH') + } + + virt_install_dirs += [ +- localstatedir / 'lib' / 'libvirt' / 'ch', +- localstatedir / 'log' / 'libvirt' / 'ch', +- runstatedir / 'libvirt' / 'ch', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'ch', ++ install_prefix + localstatedir / 'log' / 'libvirt' / 'ch', ++ install_prefix + runstatedir / 'libvirt' / 'ch', + ] + endif +diff --git a/src/interface/meson.build b/src/interface/meson.build +index 3d2991315e..20f3266738 100644 +--- a/src/interface/meson.build ++++ b/src/interface/meson.build +@@ -59,6 +59,6 @@ if conf.has('WITH_INTERFACE') + } + + virt_install_dirs += [ +- runstatedir / 'libvirt' / 'interface', ++ install_prefix + runstatedir / 'libvirt' / 'interface', + ] + endif +diff --git a/src/libxl/meson.build b/src/libxl/meson.build +index e75a8f2fdb..d1800b4ea5 100644 +--- a/src/libxl/meson.build ++++ b/src/libxl/meson.build +@@ -81,14 +81,14 @@ if conf.has('WITH_LIBXL') + } + + virt_install_dirs += [ +- confdir / 'libxl', +- confdir / 'libxl' / 'autostart', +- localstatedir / 'lib' / 'libvirt' / 'libxl', +- localstatedir / 'lib' / 'libvirt' / 'libxl' / 'channel', +- localstatedir / 'lib' / 'libvirt' / 'libxl' / 'channel' / 'target', +- localstatedir / 'lib' / 'libvirt' / 'libxl' / 'dump', +- localstatedir / 'lib' / 'libvirt' / 'libxl' / 'save', +- localstatedir / 'log' / 'libvirt' / 'libxl', +- runstatedir / 'libvirt' / 'libxl', ++ install_prefix + confdir / 'libxl', ++ install_prefix + confdir / 'libxl' / 'autostart', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl' / 'channel', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl' / 'channel' / 'target', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl' / 'dump', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl' / 'save', ++ install_prefix + localstatedir / 'log' / 'libvirt' / 'libxl', ++ install_prefix + runstatedir / 'libvirt' / 'libxl', + ] + endif +diff --git a/src/locking/meson.build b/src/locking/meson.build +index 934e47593b..e82943f31d 100644 +--- a/src/locking/meson.build ++++ b/src/locking/meson.build +@@ -247,14 +247,14 @@ if conf.has('WITH_LIBVIRTD') + } + + virt_install_dirs += [ +- localstatedir / 'lib' / 'libvirt' / 'lockd', +- localstatedir / 'lib' / 'libvirt' / 'lockd' / 'files', +- runstatedir / 'libvirt' / 'lockd', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'lockd', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'lockd' / 'files', ++ install_prefix + runstatedir / 'libvirt' / 'lockd', + ] + + if conf.has('WITH_SANLOCK') + virt_install_dirs += [ +- localstatedir / 'lib' / 'libvirt' / 'sanlock', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'sanlock', + ] + endif + endif +diff --git a/src/lxc/meson.build b/src/lxc/meson.build +index bf9afabc0f..6e9547000a 100644 +--- a/src/lxc/meson.build ++++ b/src/lxc/meson.build +@@ -190,10 +190,10 @@ if conf.has('WITH_LXC') + } + + virt_install_dirs += [ +- confdir / 'lxc', +- confdir / 'lxc' / 'autostart', +- localstatedir / 'lib' / 'libvirt' / 'lxc', +- localstatedir / 'log' / 'libvirt' / 'lxc', +- runstatedir / 'libvirt' / 'lxc', ++ install_prefix + confdir / 'lxc', ++ install_prefix + confdir / 'lxc' / 'autostart', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'lxc', ++ install_prefix + localstatedir / 'log' / 'libvirt' / 'lxc', ++ install_prefix + runstatedir / 'libvirt' / 'lxc', + ] + endif +diff --git a/src/meson.build b/src/meson.build +index 9a818dab50..5a3dd63d8c 100644 +--- a/src/meson.build ++++ b/src/meson.build +@@ -226,7 +226,7 @@ openrc_init_files = [] + + # virt_install_dirs: + # list of directories to create during installation +-virt_install_dirs = [ confdir ] ++virt_install_dirs = [ install_prefix + confdir ] + + # driver_source_files: + # driver source files to check +@@ -703,7 +703,7 @@ endforeach + + virt_conf_files += 'libvirt.conf' + +-install_data(virt_conf_files, install_dir: confdir) ++install_data(virt_conf_files, install_dir: install_prefix + confdir) + install_data(virt_aug_files, install_dir: virt_aug_dir) + + # augeas_test_data: +@@ -766,7 +766,7 @@ foreach data : virt_daemon_confs + output: '@0@.conf'.format(data['name']), + configuration: daemon_conf, + install: true, +- install_dir: confdir, ++ install_dir: install_prefix + confdir, + ) + + if data.get('with_ip', false) +@@ -914,7 +914,7 @@ if conf.has('WITH_LIBVIRTD') + + install_data( + init_file, +- install_dir: sysconfdir / 'init.d', ++ install_dir: install_prefix + sysconfdir / 'init.d', + install_mode: 'rwxr-xr-x', + rename: [ init['name'] ], + ) +@@ -922,7 +922,7 @@ if conf.has('WITH_LIBVIRTD') + if init.has_key('confd') + install_data( + init['confd'], +- install_dir: sysconfdir / 'conf.d', ++ install_dir: install_prefix + sysconfdir / 'conf.d', + rename: [ init['name'] ], + ) + endif +@@ -949,10 +949,10 @@ endif + # Install empty directories + + virt_install_dirs += [ +- localstatedir / 'cache' / 'libvirt', +- localstatedir / 'lib' / 'libvirt' / 'images', +- localstatedir / 'lib' / 'libvirt' / 'filesystems', +- localstatedir / 'lib' / 'libvirt' / 'boot', ++ install_prefix + localstatedir / 'cache' / 'libvirt', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'images', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'filesystems', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'boot', + ] + + if conf.has('WITH_LIBVIRTD') +diff --git a/src/network/meson.build b/src/network/meson.build +index 07cd5cda55..699309bb66 100644 +--- a/src/network/meson.build ++++ b/src/network/meson.build +@@ -115,11 +115,11 @@ if conf.has('WITH_NETWORK') + } + + virt_install_dirs += [ +- confdir / 'qemu' / 'networks', +- confdir / 'qemu' / 'networks' / 'autostart', +- localstatedir / 'lib' / 'libvirt' / 'network', +- localstatedir / 'lib' / 'libvirt' / 'dnsmasq', +- runstatedir / 'libvirt' / 'network', ++ install_prefix + confdir / 'qemu' / 'networks', ++ install_prefix + confdir / 'qemu' / 'networks' / 'autostart', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'network', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'dnsmasq', ++ install_prefix + runstatedir / 'libvirt' / 'network', + ] + + configure_file( +@@ -127,12 +127,12 @@ if conf.has('WITH_NETWORK') + output: '@BASENAME@', + configuration: configmake_conf, + install: true, +- install_dir: confdir / 'qemu' / 'networks', ++ install_dir: install_prefix + confdir / 'qemu' / 'networks', + ) + + meson.add_install_script( + meson_python_prog.full_path(), python3_prog.full_path(), meson_install_symlink_prog.full_path(), +- confdir / 'qemu' / 'networks' / 'autostart', ++ install_prefix + confdir / 'qemu' / 'networks' / 'autostart', + '../default.xml', 'default.xml', + ) + +diff --git a/src/node_device/meson.build b/src/node_device/meson.build +index d66c02a0e2..f883b65431 100644 +--- a/src/node_device/meson.build ++++ b/src/node_device/meson.build +@@ -67,6 +67,6 @@ if conf.has('WITH_NODE_DEVICES') + } + + virt_install_dirs += [ +- runstatedir / 'libvirt' / 'nodedev', ++ install_prefix + runstatedir / 'libvirt' / 'nodedev', + ] + endif +diff --git a/src/nwfilter/meson.build b/src/nwfilter/meson.build +index de3d202267..346c435ee7 100644 +--- a/src/nwfilter/meson.build ++++ b/src/nwfilter/meson.build +@@ -65,9 +65,9 @@ if conf.has('WITH_NWFILTER') + } + + virt_install_dirs += [ +- confdir / 'nwfilter', +- runstatedir / 'libvirt' / 'nwfilter-binding', +- runstatedir / 'libvirt' / 'nwfilter', ++ install_prefix + confdir / 'nwfilter', ++ install_prefix + runstatedir / 'libvirt' / 'nwfilter-binding', ++ install_prefix + runstatedir / 'libvirt' / 'nwfilter', + ] + + subdir('xml') +diff --git a/src/nwfilter/xml/meson.build b/src/nwfilter/xml/meson.build +index 0d96c54ebe..66c92a1016 100644 +--- a/src/nwfilter/xml/meson.build ++++ b/src/nwfilter/xml/meson.build +@@ -25,4 +25,4 @@ nwfilter_xml_files = [ + 'qemu-announce-self.xml', + ] + +-install_data(nwfilter_xml_files, install_dir: sysconfdir / 'libvirt' / 'nwfilter') ++install_data(nwfilter_xml_files, install_dir: install_prefix + sysconfdir / 'libvirt' / 'nwfilter') +diff --git a/src/qemu/meson.build b/src/qemu/meson.build +index 5cf20f426f..578e342705 100644 +--- a/src/qemu/meson.build ++++ b/src/qemu/meson.build +@@ -219,25 +219,25 @@ if conf.has('WITH_QEMU') + endif + + virt_install_dirs += [ +- confdir / 'qemu', +- confdir / 'qemu' / 'autostart', +- localstatedir / 'cache' / 'libvirt' / 'qemu', +- localstatedir / 'lib' / 'libvirt' / 'qemu', +- localstatedir / 'lib' / 'libvirt' / 'qemu' / 'channel', +- localstatedir / 'lib' / 'libvirt' / 'qemu' / 'channel' / 'target', +- localstatedir / 'lib' / 'libvirt' / 'qemu' / 'checkpoint', +- localstatedir / 'lib' / 'libvirt' / 'qemu' / 'dump', +- localstatedir / 'lib' / 'libvirt' / 'qemu' / 'nvram', +- localstatedir / 'lib' / 'libvirt' / 'qemu' / 'ram', +- localstatedir / 'lib' / 'libvirt' / 'qemu' / 'save', +- localstatedir / 'lib' / 'libvirt' / 'qemu' / 'snapshot', +- localstatedir / 'lib' / 'libvirt' / 'swtpm', +- localstatedir / 'log' / 'libvirt' / 'qemu', +- localstatedir / 'log' / 'swtpm' / 'libvirt' / 'qemu', +- runstatedir / 'libvirt' / 'qemu', +- runstatedir / 'libvirt' / 'qemu' / 'dbus', +- runstatedir / 'libvirt' / 'qemu' / 'passt', +- runstatedir / 'libvirt' / 'qemu' / 'slirp', +- runstatedir / 'libvirt' / 'qemu' / 'swtpm', ++ install_prefix + confdir / 'qemu', ++ install_prefix + confdir / 'qemu' / 'autostart', ++ install_prefix + localstatedir / 'cache' / 'libvirt' / 'qemu', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'channel', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'channel' / 'target', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'checkpoint', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'dump', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'nvram', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'ram', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'save', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'snapshot', ++ install_prefix + localstatedir / 'lib' / 'libvirt' / 'swtpm', ++ install_prefix + localstatedir / 'log' / 'libvirt' / 'qemu', ++ install_prefix + localstatedir / 'log' / 'swtpm' / 'libvirt' / 'qemu', ++ install_prefix + runstatedir / 'libvirt' / 'qemu', ++ install_prefix + runstatedir / 'libvirt' / 'qemu' / 'dbus', ++ install_prefix + runstatedir / 'libvirt' / 'qemu' / 'passt', ++ install_prefix + runstatedir / 'libvirt' / 'qemu' / 'slirp', ++ install_prefix + runstatedir / 'libvirt' / 'qemu' / 'swtpm', + ] + endif +diff --git a/src/remote/meson.build b/src/remote/meson.build +index e503263266..e0c660d8c9 100644 +--- a/src/remote/meson.build ++++ b/src/remote/meson.build +@@ -261,9 +261,9 @@ if conf.has('WITH_REMOTE') + } + + virt_install_dirs += [ +- localstatedir / 'log' / 'libvirt', +- runstatedir / 'libvirt', +- runstatedir / 'libvirt' / 'common', ++ install_prefix + localstatedir / 'log' / 'libvirt', ++ install_prefix + runstatedir / 'libvirt', ++ install_prefix + runstatedir / 'libvirt' / 'common', + ] + + logrotate_conf = configuration_data({ +@@ -278,7 +278,7 @@ if conf.has('WITH_REMOTE') + ) + install_data( + log_file, +- install_dir: sysconfdir / 'logrotate.d', ++ install_dir: install_prefix + sysconfdir / 'logrotate.d', + rename: [ name ], + ) + endforeach +@@ -338,7 +338,7 @@ endif + if conf.has('WITH_SASL') + install_data( + 'libvirtd.sasl', +- install_dir: sysconfdir / 'sasl2', ++ install_dir: install_prefix + sysconfdir / 'sasl2', + rename: [ 'libvirt.conf' ], + ) + endif +diff --git a/src/secret/meson.build b/src/secret/meson.build +index 3b859ea7b4..ccddb3e805 100644 +--- a/src/secret/meson.build ++++ b/src/secret/meson.build +@@ -48,7 +48,7 @@ if conf.has('WITH_SECRETS') + } + + virt_install_dirs += [ +- confdir / 'secrets', +- runstatedir / 'libvirt' / 'secrets', ++ install_prefix + confdir / 'secrets', ++ install_prefix + runstatedir / 'libvirt' / 'secrets', + ] + endif +diff --git a/src/security/apparmor/meson.build b/src/security/apparmor/meson.build +index 09d9fac02c..ee0c74ceec 100644 +--- a/src/security/apparmor/meson.build ++++ b/src/security/apparmor/meson.build +@@ -20,16 +20,16 @@ foreach name : apparmor_gen_profiles + output: name, + configuration: apparmor_gen_profiles_conf, + install: true, +- install_dir: apparmor_dir, ++ install_dir: install_prefix + apparmor_dir, + ) + endforeach + + install_data( + [ 'libvirt-qemu', 'libvirt-lxc' ], +- install_dir: apparmor_dir / 'abstractions', ++ install_dir: install_prefix + apparmor_dir / 'abstractions', + ) + + install_data( + [ 'TEMPLATE.qemu', 'TEMPLATE.lxc' ], +- install_dir: apparmor_dir / 'libvirt', ++ install_dir: install_prefix + apparmor_dir / 'libvirt', + ) +diff --git a/src/storage/meson.build b/src/storage/meson.build +index f6f28757ef..2bf815fd03 100644 +--- a/src/storage/meson.build ++++ b/src/storage/meson.build +@@ -124,9 +124,9 @@ if conf.has('WITH_STORAGE') + } + + virt_install_dirs += [ +- confdir / 'storage', +- confdir / 'storage' / 'autostart', +- runstatedir / 'libvirt' / 'storage', ++ install_prefix + confdir / 'storage', ++ install_prefix + confdir / 'storage' / 'autostart', ++ install_prefix + runstatedir / 'libvirt' / 'storage', + ] + endif + +diff --git a/tools/meson.build b/tools/meson.build +index 4d5c9e4bba..29077f2be6 100644 +--- a/tools/meson.build ++++ b/tools/meson.build +@@ -122,7 +122,7 @@ if conf.has('WITH_LOGIN_SHELL') + install_rpath: libvirt_rpath, + ) + +- install_data('virt-login-shell.conf', install_dir: sysconfdir / 'libvirt') ++ install_data('virt-login-shell.conf', install_dir: install_prefix + sysconfdir / 'libvirt') + + # Install the sysuser config for the setgid binary + install_data( +diff --git a/tools/ssh-proxy/meson.build b/tools/ssh-proxy/meson.build +index e9f312fa25..95d5d8fe0b 100644 +--- a/tools/ssh-proxy/meson.build ++++ b/tools/ssh-proxy/meson.build +@@ -20,6 +20,6 @@ if conf.has('WITH_SSH_PROXY') + output: '@BASENAME@', + configuration: tools_conf, + install: true, +- install_dir : sshconfdir, ++ install_dir : install_prefix + sshconfdir, + ) + endif +-- +2.49.0 diff --git a/patches/libvirt/0002-substitute-zfs-and-zpool-commands.patch b/patches/libvirt/0002-substitute-zfs-and-zpool-commands.patch new file mode 100644 index 0000000..5743ec4 --- /dev/null +++ b/patches/libvirt/0002-substitute-zfs-and-zpool-commands.patch @@ -0,0 +1,26 @@ +From dc5e3df2fd29a547ef0f9545e190a0ce3a73c95c Mon Sep 17 00:00:00 2001 +From: Tako Marks +Date: Tue, 6 Sep 2022 20:19:26 +0200 +Subject: [PATCH] substitute zfs and zpool commands + +--- + src/storage/storage_backend_zfs.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/storage/storage_backend_zfs.c b/src/storage/storage_backend_zfs.c +index 2a5d74357d..460b3025c4 100644 +--- a/src/storage/storage_backend_zfs.c ++++ b/src/storage/storage_backend_zfs.c +@@ -33,8 +33,8 @@ + + VIR_LOG_INIT("storage.storage_backend_zfs"); + +-#define ZFS "zfs" +-#define ZPOOL "zpool" ++#define ZFS "@zfs@" ++#define ZPOOL "@zpool@" + + /* + * Some common flags of zfs and zpool commands we use: +-- +2.36.2 diff --git a/tests/openstack-default-setup.nix b/tests/openstack-default-setup.nix index a6868c4..06ba04f 100644 --- a/tests/openstack-default-setup.nix +++ b/tests/openstack-default-setup.nix @@ -20,6 +20,7 @@ pkgs.nixosTest { imports = [ nixosModules.computeModule nixosModules.testModules.testCompute + nixosModules.chv-sap ]; }; diff --git a/tests/openstack-live-migration.nix b/tests/openstack-live-migration.nix index b21b10f..8f9c84c 100644 --- a/tests/openstack-live-migration.nix +++ b/tests/openstack-live-migration.nix @@ -130,6 +130,7 @@ pkgs.nixosTest { imports = [ nixosModules.computeModule nixosModules.testModules.testCompute + nixosModules.chv-sap (novaConfigForIp "10.0.0.39") ]; @@ -153,6 +154,7 @@ pkgs.nixosTest { imports = [ nixosModules.computeModule nixosModules.testModules.testCompute + nixosModules.chv-sap (novaConfigForIp "10.0.0.40") ];