python312Packages.fnllm: 0.0.11 -> 0.0.12 (#364582)
[NixPkgs.git] / nixos / maintainers / scripts / openstack / openstack-image-zfs.nix
blob57022bd2f784a31fa27314f09171aa9f4b3b6d60
1 # nix-build '<nixpkgs/nixos>' -A config.system.build.openstackImage --arg configuration "{ imports = [ ./nixos/maintainers/scripts/openstack/openstack-image.nix ]; }"
4   config,
5   lib,
6   pkgs,
7   ...
8 }:
9 let
10   inherit (lib) mkOption types;
11   copyChannel = true;
12   cfg = config.openstackImage;
13   imageBootMode = if config.openstack.efi then "uefi" else "legacy-bios";
16   imports = [
17     ../../../modules/virtualisation/openstack-config.nix
18     ../../../modules/virtualisation/disk-size-option.nix
19     (lib.mkRenamedOptionModuleWith {
20       sinceRelease = 2411;
21       from = [
22         "openstackImage"
23         "sizeMB"
24       ];
25       to = [
26         "virtualisation"
27         "diskSize"
28       ];
29     })
30   ] ++ (lib.optional copyChannel ../../../modules/installer/cd-dvd/channel.nix);
32   options.openstackImage = {
33     name = mkOption {
34       type = types.str;
35       description = "The name of the generated derivation";
36       default = "nixos-openstack-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}";
37     };
39     ramMB = mkOption {
40       type = types.int;
41       default = (3 * 1024);
42       description = "RAM allocation for build VM";
43     };
45     format = mkOption {
46       type = types.enum [
47         "raw"
48         "qcow2"
49       ];
50       default = "qcow2";
51       description = "The image format to output";
52     };
53   };
55   config = {
56     documentation.enable = copyChannel;
57     openstack = {
58       efi = true;
59       zfs = {
60         enable = true;
61         datasets = {
62           "tank/system/root".mount = "/";
63           "tank/system/var".mount = "/var";
64           "tank/local/nix".mount = "/nix";
65           "tank/user/home".mount = "/home";
66         };
67       };
68     };
70     # Use a priority just below mkOptionDefault (1500) instead of lib.mkDefault
71     # to avoid breaking existing configs using that.
72     virtualisation.diskSize = lib.mkOverride 1490 (8 * 1024);
73     virtualisation.diskSizeAutoSupported = false;
75     system.build.openstackImage = import ../../../lib/make-single-disk-zfs-image.nix {
76       inherit lib config;
77       inherit (cfg) contents format name;
78       pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
80       configFile = pkgs.writeText "configuration.nix" ''
81         { modulesPath, ... }: {
82           imports = [ "''${modulesPath}/virtualisation/openstack-config.nix" ];
83           openstack.zfs.enable = true;
84         }
85       '';
87       includeChannel = copyChannel;
89       bootSize = 1000;
90       memSize = cfg.ramMB;
91       rootSize = config.virtualisation.diskSize;
92       rootPoolProperties = {
93         ashift = 12;
94         autoexpand = "on";
95       };
97       datasets = config.openstack.zfs.datasets;
99       postVM = ''
100          extension=''${rootDiskImage##*.}
101          friendlyName=$out/${cfg.name}
102          rootDisk="$friendlyName.root.$extension"
103          mv "$rootDiskImage" "$rootDisk"
105          mkdir -p $out/nix-support
106          echo "file ${cfg.format} $rootDisk" >> $out/nix-support/hydra-build-products
108         ${pkgs.jq}/bin/jq -n \
109           --arg system_label ${lib.escapeShellArg config.system.nixos.label} \
110           --arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \
111           --arg root_logical_bytes "$(${pkgs.qemu_kvm}/bin/qemu-img info --output json "$rootDisk" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
112           --arg boot_mode "${imageBootMode}" \
113           --arg root "$rootDisk" \
114          '{}
115            | .label = $system_label
116            | .boot_mode = $boot_mode
117            | .system = $system
118            | .disks.root.logical_bytes = $root_logical_bytes
119            | .disks.root.file = $root
120            ' > $out/nix-support/image-info.json
121       '';
122     };
123   };