216: Move host and suite implementation logic to lib r=nrdxp a=Pacman99

This is just the `mkSuites` and `mkHosts` part of the `mkDevos` PR. I would like to avoid changing mkSuites and mkHosts api, to make it easier to rebase changes into the mkDevos branch. But if necessary we can change them. And to that end, there is some more logic added to the flake.nix now which would ideally not be there if devos was meant to be a template. But since the goal is to move towards a lib function with template, this is just a step in that direction.

Co-authored-by: Pacman99 <pachum99@gmail.com>
This commit is contained in:
bors[bot] 2021-03-29 17:19:51 +00:00 committed by GitHub
commit ed17d9e99f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 82 additions and 59 deletions

View file

@ -40,15 +40,19 @@
inherit extern overrides;
};
suites = os.mkSuites {
suites = import ./suites;
users = os.mkProfileAttrs "${self}/users";
profiles = os.mkProfileAttrs "${self}/profiles";
userProfiles = os.mkProfileAttrs "${self}/users/profiles";
};
outputs = {
nixosConfigurations =
import ./hosts (nixos.lib.recursiveUpdate inputs {
inherit multiPkgs extern;
defaultSystem = "x86_64-linux";
lib = nixos.lib.extend (final: prev: {
dev = self.lib;
});
});
nixosConfigurations = os.mkHosts {
dir = "${self}/hosts";
overrides = import ./overrides;
inherit multiPkgs suites extern;
};
homeConfigurations = os.mkHomeConfigurations;

View file

@ -11,6 +11,10 @@
mkNodes = dev.callLibs ./mkNodes.nix;
mkHosts = dev.callLibs ./mkHosts.nix;
mkSuites = dev.callLibs ./mkSuites.nix;
mkProfileAttrs = dev.callLibs ./mkProfileAttrs.nix;
mkPkgs = dev.callLibs ./mkPkgs.nix;

View file

@ -18,7 +18,10 @@ lib.nixosSystem (args // {
({ config, suites, ... }: {
# avoid unwanted systemd service startups
disabledModules = lib.remove modules.core suites.allProfiles;
# all strings in disabledModules get appended to modulesPath
# so convert each to list which can be coerced to string
disabledModules = map (x: [ x ])
(lib.remove modules.core suites.allProfiles);
nix.registry = lib.mapAttrs (n: v: { flake = v; }) inputs;

View file

@ -1,17 +1,8 @@
{ extern
, home
, lib
, nixos
, override
, multiPkgs
, self
, defaultSystem
, ...
}:
let
inherit (lib) dev;
{ lib, dev, nixos, inputs, self, ... }:
suites = import ../suites { inherit lib; };
{ dir, extern, suites, overrides, multiPkgs, ... }:
let
defaultSystem = "x86_64-linux";
experimentalFeatures = [
"flakes"
@ -21,10 +12,9 @@ let
];
modules = {
core = ../profiles/core;
core = "${self}/profiles/core";
modOverrides = { config, overrideModulesPath, ... }:
let
overrides = import ../overrides;
inherit (overrides) modules disabledModules;
in
{
@ -48,7 +38,7 @@ let
nix.nixPath = [
"nixpkgs=${nixos}"
"nixos-config=${self}/compat/nixos"
"home-manager=${home}"
"home-manager=${inputs.home}"
];
nixpkgs.pkgs = lib.mkDefault multiPkgs.${config.nixpkgs.system};
@ -56,7 +46,7 @@ let
nix.registry = {
devos.flake = self;
nixos.flake = nixos;
override.flake = override;
override.flake = inputs.override;
};
nix.extraOptions = ''
@ -71,7 +61,7 @@ let
# Everything in `./modules/list.nix`.
flakeModules = { imports = builtins.attrValues self.nixosModules ++ extern.modules; };
cachix = ../cachix.nix;
cachix = ../../cachix.nix;
};
specialArgs = extern.specialArgs // { suites = suites.system; };
@ -80,7 +70,7 @@ let
let
local = {
require = [
"${toString ./.}/${hostName}.nix"
"${dir}/${hostName}.nix"
];
networking = { inherit hostName; };
@ -106,7 +96,7 @@ let
hosts = dev.os.recImport
{
dir = ./.;
inherit dir;
_import = mkHostConfig;
};
in

View file

@ -27,7 +27,7 @@ let mkProfileAttrs =
f = n: _:
lib.optionalAttrs
(lib.pathExists "${dir}/${n}/default.nix")
{ default = /. + "${dir}/${n}"; }
{ default = "${dir}/${n}"; }
// mkProfileAttrs "${dir}/${n}";
in
lib.mapAttrs f imports;

24
lib/devos/mkSuites.nix Normal file
View file

@ -0,0 +1,24 @@
{ lib, dev, ... }:
{ users, profiles, userProfiles, suites } @ args:
let
inherit (dev) os;
definedSuites = suites {
inherit (args) users profiles userProfiles;
};
allProfiles =
let defaults = lib.collect (x: x ? default) profiles;
in map (x: x.default) defaults;
allUsers =
let defaults = lib.collect (x: x ? default) users;
in map (x: x.default) defaults;
createSuites = _: suites: lib.mapAttrs (_: v: os.profileMap v) suites // {
inherit allProfiles allUsers;
};
in
lib.mapAttrs createSuites definedSuites

View file

@ -1,35 +1,10 @@
{ lib }:
let
inherit (lib) dev;
{ users, profiles, userProfiles, ... }:
profiles = dev.os.mkProfileAttrs (toString ../profiles);
userProfiles = dev.os.mkProfileAttrs (toString ../users/profiles);
users = dev.os.mkProfileAttrs (toString ../users);
allProfiles =
let defaults = lib.collect (x: x ? default) profiles;
in map (x: x.default) defaults;
allUsers =
let defaults = lib.collect (x: x ? default) users;
in map (x: x.default) defaults;
suites = with profiles; rec {
{
system = with profiles; rec {
base = [ users.nixos users.root ];
};
# available as 'suites' within the home-manager configuration
userSuites = with userProfiles; rec {
user = with userProfiles; rec {
base = [ direnv git ];
};
in
{
system = lib.mapAttrs (_: v: dev.os.profileMap v) suites // {
inherit allProfiles allUsers;
};
user = lib.mapAttrs (_: v: dev.os.profileMap v) userSuites // {
allProfiles = userProfiles;
};
}

View file

@ -66,4 +66,24 @@ lib.runTests {
(rgxToString "a?" "a" == "a")
(rgxToString "hat" "foohatbar" == "hat")
];
testSuites =
let
profiles = os.mkProfileAttrs (toString ./profiles);
users = "";
userProfiles = "";
suites = { profiles, ... }: {
system.bar = [ profiles.foo ];
};
in
{
expr = os.mkSuites { inherit profiles users userProfiles suites; };
expected = {
system = {
bar = [ profiles.foo.default ];
allProfiles = [ profiles.foo.default profiles.t.default ];
allUsers = [];
};
};
};
}

View file

@ -0,0 +1,3 @@
{
bar = 5;
}

View file