Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)

nixos/xen: simplify package options

Signed-off-by: Fernando Rodrigues <alpha@sigmasquadron.net>

+147 -146
+147 -146
nixos/modules/virtualisation/xen-dom0.nix
··· 8 8 }: 9 9 10 10 let 11 + inherit (builtins) readFile; 12 + inherit (lib.modules) mkRemovedOptionModule mkRenamedOptionModule mkIf; 13 + inherit (lib.options) 14 + mkOption 15 + mkEnableOption 16 + literalExpression 17 + mkPackageOption 18 + ; 19 + inherit (lib.types) 20 + listOf 21 + str 22 + ints 23 + lines 24 + enum 25 + path 26 + submodule 27 + addCheck 28 + float 29 + bool 30 + int 31 + nullOr 32 + ; 33 + inherit (lib.lists) optional optionals; 34 + inherit (lib.strings) hasSuffix optionalString; 35 + inherit (lib.meta) getExe; 36 + inherit (lib.attrsets) optionalAttrs; 37 + inherit (lib.trivial) boolToString; 38 + inherit (lib.teams.xen) members; 39 + 11 40 cfg = config.virtualisation.xen; 12 41 13 42 xenBootBuilder = pkgs.writeShellApplication { ··· 22 51 gnused 23 52 jq 24 53 ]) 25 - ++ lib.lists.optionals (cfg.efi.bootBuilderVerbosity == "info") ( 54 + ++ optionals (cfg.efi.bootBuilderVerbosity == "info") ( 26 55 with pkgs; 27 56 [ 28 57 bat ··· 36 65 # We disable SC2016 because we don't want to expand the regexes in the sed commands. 37 66 excludeShellChecks = [ "SC2016" ]; 38 67 39 - text = builtins.readFile ./xen-boot-builder.sh; 68 + text = readFile ./xen-boot-builder.sh; 40 69 }; 41 70 in 42 71 43 72 { 44 - imports = with lib.modules; [ 73 + imports = [ 45 74 (mkRemovedOptionModule 46 75 [ 47 76 "virtualisation" ··· 123 152 124 153 options.virtualisation.xen = { 125 154 126 - enable = lib.options.mkEnableOption "the Xen Project Hypervisor, a virtualisation technology defined as a *type-1 hypervisor*, which allows multiple virtual machines, known as *domains*, to run concurrently on the physical machine. NixOS runs as the privileged *Domain 0*. This option requires a reboot into a Xen kernel to take effect"; 155 + enable = mkEnableOption "the Xen Project Hypervisor, a virtualisation technology defined as a *type-1 hypervisor*, which allows multiple virtual machines, known as *domains*, to run concurrently on the physical machine. NixOS runs as the privileged *Domain 0*. This option requires a reboot into a Xen kernel to take effect"; 127 156 128 - debug = lib.options.mkEnableOption "Xen debug features for Domain 0. This option enables some hidden debugging tests and features, and should not be used in production"; 157 + debug = mkEnableOption "Xen debug features for Domain 0. This option enables some hidden debugging tests and features, and should not be used in production"; 129 158 130 - trace = lib.options.mkOption { 131 - type = lib.types.bool; 159 + trace = mkOption { 160 + type = bool; 132 161 default = cfg.debug; 133 - defaultText = lib.options.literalExpression "false"; 162 + defaultText = literalExpression "false"; 134 163 example = true; 135 164 description = "Whether to enable Xen debug tracing and logging for Domain 0."; 136 165 }; 137 166 138 - package = lib.options.mkOption { 139 - type = lib.types.package; 140 - default = pkgs.xen; 141 - defaultText = lib.options.literalExpression "pkgs.xen"; 142 - example = lib.options.literalExpression "pkgs.xen-slim"; 143 - description = '' 144 - The package used for Xen Project Hypervisor. 145 - ''; 146 - relatedPackages = [ 147 - "xen" 148 - "xen-slim" 149 - ]; 150 - }; 167 + package = mkPackageOption pkgs "Xen Hypervisor" { default = [ "xen" ]; }; 151 168 152 169 qemu = { 153 - package = lib.options.mkOption { 154 - type = lib.types.package; 155 - default = pkgs.xen; 156 - defaultText = lib.options.literalExpression "pkgs.xen"; 157 - example = lib.options.literalExpression "pkgs.qemu_xen"; 158 - description = '' 159 - The package with QEMU binaries that runs in Domain 0 160 - and virtualises the unprivileged domains. 161 - ''; 162 - relatedPackages = [ 163 - "xen" 164 - { 165 - name = "qemu_xen"; 166 - comment = "For use with `pkgs.xen-slim`."; 167 - } 168 - ]; 170 + package = mkPackageOption pkgs "QEMU (with Xen Hypervisor support)" { 171 + default = [ "qemu_xen" ]; 169 172 }; 170 - pidFile = lib.options.mkOption { 171 - type = lib.types.path; 173 + pidFile = mkOption { 174 + type = path; 172 175 default = "/run/xen/qemu-dom0.pid"; 173 176 example = "/var/run/xen/qemu-dom0.pid"; 174 177 description = "Path to the QEMU PID file."; 175 178 }; 176 179 }; 177 180 178 - bootParams = lib.options.mkOption { 181 + bootParams = mkOption { 179 182 default = [ ]; 180 183 example = '' 181 184 [ ··· 184 187 "vga=ask" 185 188 ] 186 189 ''; 187 - type = lib.types.listOf lib.types.str; 190 + type = listOf str; 188 191 description = '' 189 192 Xen Command Line parameters passed to Domain 0 at boot time. 190 193 Note: these are different from `boot.kernelParams`. See ··· 193 196 }; 194 197 195 198 efi = { 196 - bootBuilderVerbosity = lib.options.mkOption { 197 - type = lib.types.enum [ 199 + bootBuilderVerbosity = mkOption { 200 + type = enum [ 198 201 "default" 199 202 "info" 200 203 "debug" ··· 218 221 ''; 219 222 }; 220 223 221 - path = lib.options.mkOption { 222 - type = lib.types.path; 224 + path = mkOption { 225 + type = path; 223 226 default = "${cfg.package.boot}/${cfg.package.efi}"; 224 - defaultText = lib.options.literalExpression "\${config.virtualisation.xen.package.boot}/\${config.virtualisation.xen.package.efi}"; 225 - example = lib.options.literalExpression "\${config.virtualisation.xen.package}/boot/efi/efi/nixos/xen-\${config.virtualisation.xen.package.version}.efi"; 227 + defaultText = literalExpression "\${config.virtualisation.xen.package.boot}/\${config.virtualisation.xen.package.efi}"; 228 + example = literalExpression "\${config.virtualisation.xen.package}/boot/efi/efi/nixos/xen-\${config.virtualisation.xen.package.version}.efi"; 226 229 description = '' 227 230 Path to xen.efi. `pkgs.xen` is patched to install the xen.efi file 228 231 on `$boot/boot/xen.efi`, but an unpatched Xen build may install it ··· 234 237 }; 235 238 236 239 dom0Resources = { 237 - maxVCPUs = lib.options.mkOption { 240 + maxVCPUs = mkOption { 238 241 default = 0; 239 242 example = 4; 240 - type = lib.types.ints.unsigned; 243 + type = ints.unsigned; 241 244 description = '' 242 245 Amount of virtual CPU cores allocated to Domain 0 on boot. 243 246 If set to 0, all cores are assigned to Domain 0, and ··· 245 248 ''; 246 249 }; 247 250 248 - memory = lib.options.mkOption { 251 + memory = mkOption { 249 252 default = 0; 250 253 example = 512; 251 - type = lib.types.ints.unsigned; 254 + type = ints.unsigned; 252 255 description = '' 253 256 Amount of memory (in MiB) allocated to Domain 0 on boot. 254 257 If set to 0, all memory is assigned to Domain 0, and ··· 256 259 ''; 257 260 }; 258 261 259 - maxMemory = lib.options.mkOption { 262 + maxMemory = mkOption { 260 263 default = cfg.dom0Resources.memory; 261 - defaultText = lib.options.literalExpression "config.virtualisation.xen.dom0Resources.memory"; 264 + defaultText = literalExpression "config.virtualisation.xen.dom0Resources.memory"; 262 265 example = 1024; 263 - type = lib.types.ints.unsigned; 266 + type = ints.unsigned; 264 267 description = '' 265 268 Maximum amount of memory (in MiB) that Domain 0 can 266 269 dynamically allocate to itself. Does nothing if set ··· 271 274 }; 272 275 273 276 domains = { 274 - extraConfig = lib.options.mkOption { 275 - type = lib.types.lines; 277 + extraConfig = mkOption { 278 + type = lines; 276 279 default = ""; 277 280 example = '' 278 281 XENDOMAINS_SAVE=/persist/xen/save ··· 288 291 }; 289 292 290 293 store = { 291 - path = lib.options.mkOption { 292 - type = lib.types.path; 294 + path = mkOption { 295 + type = path; 293 296 default = "${cfg.package}/bin/oxenstored"; 294 - defaultText = lib.options.literalExpression "\${config.virtualisation.xen.package}/bin/oxenstored"; 295 - example = lib.options.literalExpression "\${config.virtualisation.xen.package}/bin/xenstored"; 297 + defaultText = literalExpression "\${config.virtualisation.xen.package}/bin/oxenstored"; 298 + example = literalExpression "\${config.virtualisation.xen.package}/bin/xenstored"; 296 299 description = '' 297 300 Path to the Xen Store Daemon. This option is useful to 298 301 switch between the legacy C-based Xen Store Daemon, and 299 302 the newer OCaml-based Xen Store Daemon, `oxenstored`. 300 303 ''; 301 304 }; 302 - type = lib.options.mkOption { 303 - type = lib.types.enum [ 305 + type = mkOption { 306 + type = enum [ 304 307 "c" 305 308 "ocaml" 306 309 ]; 307 - default = if (lib.strings.hasSuffix "oxenstored" cfg.store.path) then "ocaml" else "c"; 310 + default = if (hasSuffix "oxenstored" cfg.store.path) then "ocaml" else "c"; 308 311 internal = true; 309 312 readOnly = true; 310 313 description = "Helper internal option that determines the type of the Xen Store Daemon based on cfg.store.path."; 311 314 }; 312 - settings = lib.options.mkOption { 315 + settings = mkOption { 313 316 default = { }; 314 317 example = { 315 318 enableMerge = false; ··· 324 327 The OCaml-based Xen Store Daemon configuration. This 325 328 option does nothing with the C-based `xenstored`. 326 329 ''; 327 - type = lib.types.submodule { 330 + type = submodule { 328 331 options = { 329 - pidFile = lib.options.mkOption { 332 + pidFile = mkOption { 330 333 default = "/run/xen/xenstored.pid"; 331 334 example = "/var/run/xen/xenstored.pid"; 332 - type = lib.types.path; 335 + type = path; 333 336 description = "Path to the Xen Store Daemon PID file."; 334 337 }; 335 - testEAGAIN = lib.options.mkOption { 338 + testEAGAIN = mkOption { 336 339 default = cfg.debug; 337 - defaultText = lib.options.literalExpression "config.virtualisation.xen.debug"; 340 + defaultText = literalExpression "config.virtualisation.xen.debug"; 338 341 example = true; 339 - type = lib.types.bool; 342 + type = bool; 340 343 visible = false; 341 344 description = "Randomly fail a transaction with EAGAIN. This option is used for debugging purposes only."; 342 345 }; 343 - enableMerge = lib.options.mkOption { 346 + enableMerge = mkOption { 344 347 default = true; 345 348 example = false; 346 - type = lib.types.bool; 349 + type = bool; 347 350 description = "Whether to enable transaction merge support."; 348 351 }; 349 352 conflict = { 350 - burstLimit = lib.options.mkOption { 353 + burstLimit = mkOption { 351 354 default = 5.0; 352 355 example = 15.0; 353 - type = lib.types.addCheck ( 354 - lib.types.float 356 + type = addCheck ( 357 + float 355 358 // { 356 359 name = "nonnegativeFloat"; 357 360 description = "nonnegative floating point number, meaning >=0"; ··· 369 372 domain's requests are ignored. 370 373 ''; 371 374 }; 372 - maxHistorySeconds = lib.options.mkOption { 375 + maxHistorySeconds = mkOption { 373 376 default = 5.0e-2; 374 377 example = 1.0; 375 - type = lib.types.addCheck ( 376 - lib.types.float // { description = "nonnegative floating point number, meaning >=0"; } 377 - ) (n: n >= 0); 378 + type = addCheck (float // { description = "nonnegative floating point number, meaning >=0"; }) ( 379 + n: n >= 0 380 + ); 378 381 description = '' 379 382 Limits applied to domains whose writes cause other domains' transaction 380 383 commits to fail. Must include decimal point. ··· 384 387 is the minimum pause-time during which a domain will be ignored. 385 388 ''; 386 389 }; 387 - rateLimitIsAggregate = lib.options.mkOption { 390 + rateLimitIsAggregate = mkOption { 388 391 default = true; 389 392 example = false; 390 - type = lib.types.bool; 393 + type = bool; 391 394 description = '' 392 395 If the conflict.rateLimitIsAggregate option is `true`, then after each 393 396 tick one point of conflict-credit is given to just one domain: the ··· 408 411 }; 409 412 }; 410 413 perms = { 411 - enable = lib.options.mkOption { 414 + enable = mkOption { 412 415 default = true; 413 416 example = false; 414 - type = lib.types.bool; 417 + type = bool; 415 418 description = "Whether to enable the node permission system."; 416 419 }; 417 - enableWatch = lib.options.mkOption { 420 + enableWatch = mkOption { 418 421 default = true; 419 422 example = false; 420 - type = lib.types.bool; 423 + type = bool; 421 424 description = '' 422 425 Whether to enable the watch permission system. 423 426 ··· 432 435 }; 433 436 }; 434 437 quota = { 435 - enable = lib.options.mkOption { 438 + enable = mkOption { 436 439 default = true; 437 440 example = false; 438 - type = lib.types.bool; 441 + type = bool; 439 442 description = "Whether to enable the quota system."; 440 443 }; 441 - maxEntity = lib.options.mkOption { 444 + maxEntity = mkOption { 442 445 default = 1000; 443 446 example = 1024; 444 - type = lib.types.ints.positive; 447 + type = ints.positive; 445 448 description = "Entity limit for transactions."; 446 449 }; 447 - maxSize = lib.options.mkOption { 450 + maxSize = mkOption { 448 451 default = 2048; 449 452 example = 4096; 450 - type = lib.types.ints.positive; 453 + type = ints.positive; 451 454 description = "Size limit for transactions."; 452 455 }; 453 - maxWatch = lib.options.mkOption { 456 + maxWatch = mkOption { 454 457 default = 100; 455 458 example = 256; 456 - type = lib.types.ints.positive; 459 + type = ints.positive; 457 460 description = "Maximum number of watches by the Xenstore Watchdog."; 458 461 }; 459 - transaction = lib.options.mkOption { 462 + transaction = mkOption { 460 463 default = 10; 461 464 example = 50; 462 - type = lib.types.ints.positive; 465 + type = ints.positive; 463 466 description = "Maximum number of transactions."; 464 467 }; 465 - maxRequests = lib.options.mkOption { 468 + maxRequests = mkOption { 466 469 default = 1024; 467 470 example = 1024; 468 - type = lib.types.ints.positive; 471 + type = ints.positive; 469 472 description = "Maximum number of requests per transaction."; 470 473 }; 471 - maxPath = lib.options.mkOption { 474 + maxPath = mkOption { 472 475 default = 1024; 473 476 example = 1024; 474 - type = lib.types.ints.positive; 477 + type = ints.positive; 475 478 description = "Path limit for the quota system."; 476 479 }; 477 - maxOutstanding = lib.options.mkOption { 480 + maxOutstanding = mkOption { 478 481 default = 1024; 479 482 example = 1024; 480 - type = lib.types.ints.positive; 483 + type = ints.positive; 481 484 description = "Maximum outstanding requests, i.e. in-flight requests / domain."; 482 485 }; 483 - maxWatchEvents = lib.options.mkOption { 486 + maxWatchEvents = mkOption { 484 487 default = 1024; 485 488 example = 2048; 486 - type = lib.types.ints.positive; 489 + type = ints.positive; 487 490 description = "Maximum number of outstanding watch events per watch."; 488 491 }; 489 492 }; 490 - persistent = lib.options.mkOption { 493 + persistent = mkOption { 491 494 default = false; 492 495 example = true; 493 - type = lib.types.bool; 496 + type = bool; 494 497 description = "Whether to activate the filed base backend."; 495 498 }; 496 499 xenstored = { 497 500 log = { 498 - file = lib.options.mkOption { 501 + file = mkOption { 499 502 default = "/var/log/xen/xenstored.log"; 500 503 example = "/dev/null"; 501 - type = lib.types.path; 504 + type = path; 502 505 description = "Path to the Xen Store log file."; 503 506 }; 504 - level = lib.options.mkOption { 507 + level = mkOption { 505 508 default = if cfg.trace then "debug" else null; 506 - defaultText = lib.options.literalExpression "if (config.virtualisation.xen.trace == true) then \"debug\" else null"; 509 + defaultText = literalExpression "if (config.virtualisation.xen.trace == true) then \"debug\" else null"; 507 510 example = "error"; 508 - type = lib.types.nullOr ( 509 - lib.types.enum [ 510 - "debug" 511 - "info" 512 - "warn" 513 - "error" 514 - ] 515 - ); 511 + type = nullOr (enum [ 512 + "debug" 513 + "info" 514 + "warn" 515 + "error" 516 + ]); 516 517 description = "Logging level for the Xen Store."; 517 518 }; 518 519 # The hidden options below have no upstream documentation whatsoever. 519 520 # The nb* options appear to alter the log rotation behaviour, and 520 521 # the specialOps option appears to affect the Xenbus logging logic. 521 - nbFiles = lib.options.mkOption { 522 + nbFiles = mkOption { 522 523 default = 10; 523 524 example = 16; 524 - type = lib.types.int; 525 + type = int; 525 526 visible = false; 526 527 description = "Set `xenstored-log-nb-files`."; 527 528 }; 528 529 }; 529 530 accessLog = { 530 - file = lib.options.mkOption { 531 + file = mkOption { 531 532 default = "/var/log/xen/xenstored-access.log"; 532 533 example = "/var/log/security/xenstored-access.log"; 533 - type = lib.types.path; 534 + type = path; 534 535 description = "Path to the Xen Store access log file."; 535 536 }; 536 - nbLines = lib.options.mkOption { 537 + nbLines = mkOption { 537 538 default = 13215; 538 539 example = 16384; 539 - type = lib.types.int; 540 + type = int; 540 541 visible = false; 541 542 description = "Set `access-log-nb-lines`."; 542 543 }; 543 - nbChars = lib.options.mkOption { 544 + nbChars = mkOption { 544 545 default = 180; 545 546 example = 256; 546 - type = lib.types.int; 547 + type = int; 547 548 visible = false; 548 549 description = "Set `acesss-log-nb-chars`."; 549 550 }; 550 - specialOps = lib.options.mkOption { 551 + specialOps = mkOption { 551 552 default = false; 552 553 example = true; 553 - type = lib.types.bool; 554 + type = bool; 554 555 visible = false; 555 556 description = "Set `access-log-special-ops`."; 556 557 }; 557 558 }; 558 559 xenfs = { 559 - kva = lib.options.mkOption { 560 + kva = mkOption { 560 561 default = "/proc/xen/xsd_kva"; 561 562 example = cfg.store.settings.xenstored.xenfs.kva; 562 - type = lib.types.path; 563 + type = path; 563 564 visible = false; 564 565 description = '' 565 566 Path to the Xen Store Daemon KVA location inside the XenFS pseudo-filesystem. 566 567 While it is possible to alter this value, some drivers may be hardcoded to follow the default paths. 567 568 ''; 568 569 }; 569 - port = lib.options.mkOption { 570 + port = mkOption { 570 571 default = "/proc/xen/xsd_port"; 571 572 example = cfg.store.settings.xenstored.xenfs.port; 572 - type = lib.types.path; 573 + type = path; 573 574 visible = false; 574 575 description = '' 575 576 Path to the Xen Store Daemon userspace port inside the XenFS pseudo-filesystem. ··· 578 579 }; 579 580 }; 580 581 }; 581 - ringScanInterval = lib.options.mkOption { 582 + ringScanInterval = mkOption { 582 583 default = 20; 583 584 example = 30; 584 - type = lib.types.addCheck ( 585 - lib.types.int 585 + type = addCheck ( 586 + int 586 587 // { 587 588 name = "nonzeroInt"; 588 589 description = "nonzero signed integer, meaning !=0"; ··· 602 603 603 604 ## Implementation ## 604 605 605 - config = lib.modules.mkIf cfg.enable { 606 + config = mkIf cfg.enable { 606 607 assertions = [ 607 608 { 608 609 assertion = pkgs.stdenv.hostPlatform.isx86_64; ··· 639 640 ]; 640 641 641 642 virtualisation.xen.bootParams = 642 - lib.lists.optionals cfg.trace [ 643 + optionals cfg.trace [ 643 644 "loglvl=all" 644 645 "guest_loglvl=all" 645 646 ] 646 647 ++ 647 - lib.lists.optional (cfg.dom0Resources.memory != 0) 648 + optional (cfg.dom0Resources.memory != 0) 648 649 "dom0_mem=${toString cfg.dom0Resources.memory}M${ 649 - lib.strings.optionalString ( 650 + optionalString ( 650 651 cfg.dom0Resources.memory != cfg.dom0Resources.maxMemory 651 652 ) ",max:${toString cfg.dom0Resources.maxMemory}M" 652 653 }" 653 - ++ lib.lists.optional ( 654 + ++ optional ( 654 655 cfg.dom0Resources.maxVCPUs != 0 655 656 ) "dom0_max_vcpus=${toString cfg.dom0Resources.maxVCPUs}"; 656 657 ··· 701 702 702 703 # See the `xenBootBuilder` script in the main `let...in` statement of this file. 703 704 loader.systemd-boot.extraInstallCommands = '' 704 - ${lib.meta.getExe xenBootBuilder} ${cfg.efi.bootBuilderVerbosity} 705 + ${getExe xenBootBuilder} ${cfg.efi.bootBuilderVerbosity} 705 706 ''; 706 707 }; 707 708 ··· 744 745 745 746 XENSTORED="${cfg.store.path}" 746 747 QEMU_XEN="${cfg.qemu.package}/${cfg.qemu.package.qemu-system-i386}" 747 - ${lib.strings.optionalString cfg.trace '' 748 + ${optionalString cfg.trace '' 748 749 XENSTORED_TRACE=yes 749 750 XENCONSOLED_TRACE=all 750 751 ''} ··· 756 757 ''; 757 758 } 758 759 # The OCaml-based Xen Store Daemon requires /etc/xen/oxenstored.conf to start. 759 - // lib.attrsets.optionalAttrs (cfg.store.type == "ocaml") { 760 + // optionalAttrs (cfg.store.type == "ocaml") { 760 761 "xen/oxenstored.conf".text = '' 761 762 pid-file = ${cfg.store.settings.pidFile} 762 - test-eagain = ${lib.trivial.boolToString cfg.store.settings.testEAGAIN} 763 + test-eagain = ${boolToString cfg.store.settings.testEAGAIN} 763 764 merge-activate = ${toString cfg.store.settings.enableMerge} 764 765 conflict-burst-limit = ${toString cfg.store.settings.conflict.burstLimit} 765 766 conflict-max-history-seconds = ${toString cfg.store.settings.conflict.maxHistorySeconds} ··· 775 776 quota-path-max = ${toString cfg.store.settings.quota.maxPath} 776 777 quota-maxoutstanding = ${toString cfg.store.settings.quota.maxOutstanding} 777 778 quota-maxwatchevents = ${toString cfg.store.settings.quota.maxWatchEvents} 778 - persistent = ${lib.trivial.boolToString cfg.store.settings.persistent} 779 + persistent = ${boolToString cfg.store.settings.persistent} 779 780 xenstored-log-file = ${cfg.store.settings.xenstored.log.file} 780 781 xenstored-log-level = ${ 781 782 if isNull cfg.store.settings.xenstored.log.level then ··· 787 788 access-log-file = ${cfg.store.settings.xenstored.accessLog.file} 788 789 access-log-nb-lines = ${toString cfg.store.settings.xenstored.accessLog.nbLines} 789 790 acesss-log-nb-chars = ${toString cfg.store.settings.xenstored.accessLog.nbChars} 790 - access-log-special-ops = ${lib.trivial.boolToString cfg.store.settings.xenstored.accessLog.specialOps} 791 + access-log-special-ops = ${boolToString cfg.store.settings.xenstored.accessLog.specialOps} 791 792 ring-scan-interval = ${toString cfg.store.settings.ringScanInterval} 792 793 xenstored-kva = ${cfg.store.settings.xenstored.xenfs.kva} 793 794 xenstored-port = ${cfg.store.settings.xenstored.xenfs.port} ··· 870 871 }; 871 872 }; 872 873 }; 873 - meta.maintainers = lib.teams.xen.members; 874 + meta.maintainers = members; 874 875 }