diff --git a/nixos/modules/virtualisation/lxc-container.nix b/nixos/modules/virtualisation/lxc-container.nix index 3b70ed14f550..21824c72a8b9 100644 --- a/nixos/modules/virtualisation/lxc-container.nix +++ b/nixos/modules/virtualisation/lxc-container.nix @@ -1,37 +1,101 @@ -{ lib, ... }: +{ lib, config, pkgs, ... }: with lib; +let + templateSubmodule = { ... }: { + options = { + enable = mkEnableOption "this template"; + + target = mkOption { + description = "Path in the container"; + type = types.path; + }; + template = mkOption { + description = ".tpl file for rendering the target"; + type = types.path; + }; + when = mkOption { + description = "Events which trigger a rewrite (create, copy)"; + type = types.listOf (types.str); + }; + properties = mkOption { + description = "Additional properties"; + type = types.attrs; + default = {}; + }; + }; + }; + + toYAML = name: attrs: pkgs.runCommandNoCC name { + preferLocalBuild = true; + json = builtins.toFile "${name}.json" (builtins.toJSON attrs); + nativeBuildInputs = [ pkgs.remarshal ]; + } "json2yaml -i $json -o $out"; + + cfg = config.virtualisation.lxc; + templates = if cfg.templates != {} then let + list = mapAttrsToList (name: value: { inherit name; } // value) + (filterAttrs (name: value: value.enable) cfg.templates); + in + { + files = map (tpl: { + source = tpl.template; + target = "/templates/${tpl.name}.tpl"; + }) list; + properties = listToAttrs (map (tpl: nameValuePair tpl.target { + when = tpl.when; + template = "${tpl.name}.tpl"; + properties = tpl.properties; + }) list); + } + else { files = []; properties = {}; }; + +in { imports = [ ../profiles/docker-container.nix # FIXME, shouldn't include something from profiles/ ]; + options = { + virtualisation.lxc = { + templates = mkOption { + description = "Templates for LXD"; + type = types.attrsOf (types.submodule (templateSubmodule)); + }; + }; + }; + config = { system.build.tarball = mkForce (pkgs.callPackage ../../lib/make-system-tarball.nix { extraArgs = "--owner=0"; storeContents = [ - config.system.build.toplevel + { + object = config.system.build.toplevel; + symlink = "none"; + } ]; contents = [ { - source = pkgs.writeText "metadata.yaml" '' - architecture: ${builtins.elemAt (builtins.match "^([a-z0-9_]+).+" (toString pkgs.system)) 0} - creation_date: 0 - properties: - description: NixOS ${config.system.nixos.codeName} ${config.system.nixos.label} ${pkgs.system} - os: nixos - release: ${config.system.nixos.codeName} - ''; + source = toYAML "metadata.yaml" { + architecture = builtins.elemAt (builtins.match "^([a-z0-9_]+).+" (toString pkgs.system)) 0; + creation_date = 1; + properties = { + description = "NixOS ${config.system.nixos.codeName} ${config.system.nixos.label} ${pkgs.system}"; + os = "nixos"; + release = "${config.system.nixos.codeName}"; + }; + templates = templates.properties; + }; target = "/metadata.yaml"; } { source = config.system.build.toplevel + "/init"; target = "/sbin/init"; } - ]; + ] ++ templates.files; extraCommands = "mkdir -p proc sys dev"; });