Merge pull request 'tests(clan): move test-inventory.nix to clanLib. And name it 'makeTestClan'' (#3330) from hsjobeki/clan-core:lib-cleanup into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3330
This commit is contained in:
@@ -1,78 +1,86 @@
|
|||||||
(import ../lib/test-inventory.nix) (
|
{
|
||||||
{ lib, ... }:
|
pkgs,
|
||||||
let
|
self,
|
||||||
|
clanLib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
clanLib.test.makeTestClan {
|
||||||
|
inherit pkgs self;
|
||||||
|
nixosTest = (
|
||||||
|
{ lib, ... }:
|
||||||
|
let
|
||||||
|
machines = [
|
||||||
|
"admin"
|
||||||
|
"peer"
|
||||||
|
"signer"
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
name = "data-mesher";
|
||||||
|
|
||||||
machines = [
|
clan = {
|
||||||
"admin"
|
directory = ./.;
|
||||||
"peer"
|
inventory = {
|
||||||
"signer"
|
machines = lib.genAttrs machines (_: { });
|
||||||
];
|
services = {
|
||||||
in
|
data-mesher.default = {
|
||||||
{
|
roles.peer.machines = [ "peer" ];
|
||||||
name = "data-mesher";
|
roles.admin.machines = [ "admin" ];
|
||||||
|
roles.signer.machines = [ "signer" ];
|
||||||
clan = {
|
};
|
||||||
directory = ./.;
|
|
||||||
inventory = {
|
|
||||||
machines = lib.genAttrs machines (_: { });
|
|
||||||
services = {
|
|
||||||
data-mesher.default = {
|
|
||||||
roles.peer.machines = [ "peer" ];
|
|
||||||
roles.admin.machines = [ "admin" ];
|
|
||||||
roles.signer.machines = [ "signer" ];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
defaults =
|
defaults =
|
||||||
{ config, ... }:
|
{ config, ... }:
|
||||||
{
|
{
|
||||||
environment.systemPackages = [
|
environment.systemPackages = [
|
||||||
config.services.data-mesher.package
|
config.services.data-mesher.package
|
||||||
];
|
];
|
||||||
|
|
||||||
clan.data-mesher.network.interface = "eth1";
|
clan.data-mesher.network.interface = "eth1";
|
||||||
clan.data-mesher.bootstrapNodes = [
|
clan.data-mesher.bootstrapNodes = [
|
||||||
"[2001:db8:1::1]:7946" # peer1
|
"[2001:db8:1::1]:7946" # peer1
|
||||||
"[2001:db8:1::2]:7946" # peer2
|
"[2001:db8:1::2]:7946" # peer2
|
||||||
];
|
];
|
||||||
|
|
||||||
# speed up for testing
|
# speed up for testing
|
||||||
services.data-mesher.settings = {
|
services.data-mesher.settings = {
|
||||||
cluster.join_interval = lib.mkForce "2s";
|
cluster.join_interval = lib.mkForce "2s";
|
||||||
cluster.push_pull_interval = lib.mkForce "5s";
|
cluster.push_pull_interval = lib.mkForce "5s";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nodes = {
|
||||||
|
admin.clan.data-mesher.network.tld = "foo";
|
||||||
};
|
};
|
||||||
|
|
||||||
nodes = {
|
# TODO Add better test script.
|
||||||
admin.clan.data-mesher.network.tld = "foo";
|
testScript = ''
|
||||||
};
|
|
||||||
|
|
||||||
# TODO Add better test script.
|
def resolve(node, success = {}, fail = [], timeout = 60):
|
||||||
testScript = ''
|
for hostname, ips in success.items():
|
||||||
|
for ip in ips:
|
||||||
|
node.wait_until_succeeds(f"getent ahosts {hostname} | grep {ip}", timeout)
|
||||||
|
|
||||||
def resolve(node, success = {}, fail = [], timeout = 60):
|
for hostname in fail:
|
||||||
for hostname, ips in success.items():
|
node.wait_until_fails(f"getent ahosts {hostname}")
|
||||||
for ip in ips:
|
|
||||||
node.wait_until_succeeds(f"getent ahosts {hostname} | grep {ip}", timeout)
|
|
||||||
|
|
||||||
for hostname in fail:
|
start_all()
|
||||||
node.wait_until_fails(f"getent ahosts {hostname}")
|
|
||||||
|
|
||||||
start_all()
|
admin.wait_for_unit("data-mesher")
|
||||||
|
signer.wait_for_unit("data-mesher")
|
||||||
|
peer.wait_for_unit("data-mesher")
|
||||||
|
|
||||||
admin.wait_for_unit("data-mesher")
|
# check dns resolution
|
||||||
signer.wait_for_unit("data-mesher")
|
for node in [admin, signer, peer]:
|
||||||
peer.wait_for_unit("data-mesher")
|
resolve(node, {
|
||||||
|
"admin.foo": ["2001:db8:1::1", "192.168.1.1"],
|
||||||
# check dns resolution
|
"peer.foo": ["2001:db8:1::2", "192.168.1.2"],
|
||||||
for node in [admin, signer, peer]:
|
"signer.foo": ["2001:db8:1::3", "192.168.1.3"]
|
||||||
resolve(node, {
|
})
|
||||||
"admin.foo": ["2001:db8:1::1", "192.168.1.1"],
|
'';
|
||||||
"peer.foo": ["2001:db8:1::2", "192.168.1.2"],
|
}
|
||||||
"signer.foo": ["2001:db8:1::3", "192.168.1.3"]
|
);
|
||||||
})
|
}
|
||||||
'';
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -1,67 +1,76 @@
|
|||||||
(import ../lib/test-inventory.nix) (
|
{
|
||||||
{ ... }:
|
pkgs,
|
||||||
{
|
self,
|
||||||
# This tests the compatibility of the inventory
|
clanLib,
|
||||||
# With the test framework
|
...
|
||||||
# - legacy-modules
|
}:
|
||||||
# - clan.service modules
|
clanLib.test.makeTestClan {
|
||||||
name = "dummy-inventory-test";
|
inherit pkgs self;
|
||||||
|
nixosTest = (
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
# This tests the compatibility of the inventory
|
||||||
|
# With the test framework
|
||||||
|
# - legacy-modules
|
||||||
|
# - clan.service modules
|
||||||
|
name = "dummy-inventory-test";
|
||||||
|
|
||||||
clan = {
|
clan = {
|
||||||
directory = ./.;
|
directory = ./.;
|
||||||
inventory = {
|
inventory = {
|
||||||
machines.peer1 = { };
|
machines.peer1 = { };
|
||||||
machines.admin1 = { };
|
machines.admin1 = { };
|
||||||
services = {
|
services = {
|
||||||
legacy-module.default = {
|
legacy-module.default = {
|
||||||
roles.peer.machines = [ "peer1" ];
|
roles.peer.machines = [ "peer1" ];
|
||||||
roles.admin.machines = [ "admin1" ];
|
roles.admin.machines = [ "admin1" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
instances."test" = {
|
||||||
|
module.name = "new-service";
|
||||||
|
roles.peer.machines.peer1 = { };
|
||||||
};
|
};
|
||||||
};
|
|
||||||
instances."test" = {
|
|
||||||
module.name = "new-service";
|
|
||||||
roles.peer.machines.peer1 = { };
|
|
||||||
};
|
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
legacy-module = ./legacy-module;
|
legacy-module = ./legacy-module;
|
||||||
new-service = {
|
new-service = {
|
||||||
_class = "clan.service";
|
_class = "clan.service";
|
||||||
manifest.name = "new-service";
|
manifest.name = "new-service";
|
||||||
roles.peer = { };
|
roles.peer = { };
|
||||||
perMachine = {
|
perMachine = {
|
||||||
nixosModule = {
|
nixosModule = {
|
||||||
# This should be generated by:
|
# This should be generated by:
|
||||||
# ./pkgs/scripts/update-vars.py inventory-test-framework-compatibility-test
|
# ./pkgs/scripts/update-vars.py inventory-test-framework-compatibility-test
|
||||||
clan.core.vars.generators.new-service = {
|
clan.core.vars.generators.new-service = {
|
||||||
files.hello = {
|
files.hello = {
|
||||||
secret = false;
|
secret = false;
|
||||||
deploy = true;
|
deploy = true;
|
||||||
|
};
|
||||||
|
script = ''
|
||||||
|
# This is a dummy script that does nothing
|
||||||
|
echo "This is a dummy script" > $out/hello
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
script = ''
|
|
||||||
# This is a dummy script that does nothing
|
|
||||||
echo "This is a dummy script" > $out/hello
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
testScript =
|
testScript =
|
||||||
{ nodes, ... }:
|
{ nodes, ... }:
|
||||||
''
|
''
|
||||||
start_all()
|
start_all()
|
||||||
admin1.wait_for_unit("multi-user.target")
|
admin1.wait_for_unit("multi-user.target")
|
||||||
peer1.wait_for_unit("multi-user.target")
|
peer1.wait_for_unit("multi-user.target")
|
||||||
# Provided by the legacy module
|
# Provided by the legacy module
|
||||||
print(admin1.succeed("systemctl status dummy-service"))
|
print(admin1.succeed("systemctl status dummy-service"))
|
||||||
print(peer1.succeed("systemctl status dummy-service"))
|
print(peer1.succeed("systemctl status dummy-service"))
|
||||||
|
|
||||||
# peer1 should have the 'hello' file
|
# peer1 should have the 'hello' file
|
||||||
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.hello.path}")
|
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.hello.path}")
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
)
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -27,9 +27,10 @@ in
|
|||||||
let
|
let
|
||||||
nixosTestArgs = {
|
nixosTestArgs = {
|
||||||
# reference to nixpkgs for the current system
|
# reference to nixpkgs for the current system
|
||||||
inherit pkgs;
|
inherit pkgs lib;
|
||||||
# this gives us a reference to our flake but also all flake inputs
|
# this gives us a reference to our flake but also all flake inputs
|
||||||
inherit self;
|
inherit self;
|
||||||
|
inherit (self) clanLib;
|
||||||
};
|
};
|
||||||
nixosTests = lib.optionalAttrs (pkgs.stdenv.isLinux) {
|
nixosTests = lib.optionalAttrs (pkgs.stdenv.isLinux) {
|
||||||
# import our test
|
# import our test
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ in
|
|||||||
imports = [
|
imports = [
|
||||||
(modulesPath + "/testing/test-instrumentation.nix") # we need these 2 modules always to be able to run the tests
|
(modulesPath + "/testing/test-instrumentation.nix") # we need these 2 modules always to be able to run the tests
|
||||||
(modulesPath + "/profiles/qemu-guest.nix")
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
../lib/minify.nix
|
self.clanLib.test.minifyModule
|
||||||
];
|
];
|
||||||
|
|
||||||
networking.hostName = "test-install-machine";
|
networking.hostName = "test-install-machine";
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ in
|
|||||||
{ config, options, ... }:
|
{ config, options, ... }:
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./minify.nix
|
self.clanLib.test.minifyModule
|
||||||
];
|
];
|
||||||
config = lib.mkMerge [
|
config = lib.mkMerge [
|
||||||
(lib.optionalAttrs (options ? clan) {
|
(lib.optionalAttrs (options ? clan) {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ in
|
|||||||
{ config, options, ... }:
|
{ config, options, ... }:
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./minify.nix
|
self.clanLib.test.minifyModule
|
||||||
];
|
];
|
||||||
config = lib.mkMerge [
|
config = lib.mkMerge [
|
||||||
(lib.optionalAttrs (options ? clan) {
|
(lib.optionalAttrs (options ? clan) {
|
||||||
|
|||||||
@@ -1,89 +0,0 @@
|
|||||||
test:
|
|
||||||
{ pkgs, self, ... }:
|
|
||||||
let
|
|
||||||
inherit (pkgs) lib;
|
|
||||||
inherit (lib)
|
|
||||||
mkOption
|
|
||||||
flip
|
|
||||||
mapAttrs
|
|
||||||
types
|
|
||||||
;
|
|
||||||
nixos-lib = import (pkgs.path + "/nixos/lib") { };
|
|
||||||
in
|
|
||||||
(nixos-lib.runTest (
|
|
||||||
{ config, ... }:
|
|
||||||
let
|
|
||||||
clanFlakeResult = config.clan;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [ test ];
|
|
||||||
options = {
|
|
||||||
clanSettings = mkOption {
|
|
||||||
default = { };
|
|
||||||
type = types.submodule {
|
|
||||||
options = {
|
|
||||||
clan-core = mkOption { default = self; };
|
|
||||||
nixpkgs = mkOption { default = self.inputs.nixpkgs; };
|
|
||||||
nix-darwin = mkOption { default = self.inputs.nix-darwin; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
clan = mkOption {
|
|
||||||
default = { };
|
|
||||||
type = types.submoduleWith {
|
|
||||||
specialArgs = {
|
|
||||||
inherit (config.clanSettings)
|
|
||||||
clan-core
|
|
||||||
nixpkgs
|
|
||||||
nix-darwin
|
|
||||||
;
|
|
||||||
};
|
|
||||||
modules = [
|
|
||||||
self.clanLib.buildClanModule.flakePartsModule
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
config = {
|
|
||||||
nodes = flip mapAttrs clanFlakeResult.clanInternals.inventoryClass.machines (
|
|
||||||
machineName: attrs: {
|
|
||||||
imports = attrs.machineImports ++ [ self.nixosModules.clanCore ];
|
|
||||||
clan.core.settings.directory = "${config.clan.directory}";
|
|
||||||
clan.core.settings.machine.name = machineName;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
hostPkgs = pkgs;
|
|
||||||
# speed-up evaluation
|
|
||||||
defaults = (
|
|
||||||
{ config, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./minify.nix
|
|
||||||
];
|
|
||||||
documentation.enable = lib.mkDefault false;
|
|
||||||
nix.settings.min-free = 0;
|
|
||||||
system.stateVersion = config.system.nixos.release;
|
|
||||||
boot.initrd.systemd.enable = false;
|
|
||||||
|
|
||||||
# setup for sops
|
|
||||||
sops.age.keyFile = "/run/age-key.txt";
|
|
||||||
system.activationScripts =
|
|
||||||
{
|
|
||||||
setupSecrets.deps = [ "age-key" ];
|
|
||||||
age-key.text = ''
|
|
||||||
echo AGE-SECRET-KEY-1PL0M9CWRCG3PZ9DXRTTLMCVD57U6JDFE8K7DNVQ35F4JENZ6G3MQ0RQLRV > /run/age-key.txt
|
|
||||||
'';
|
|
||||||
}
|
|
||||||
// lib.optionalAttrs (lib.filterAttrs (_: v: v.neededForUsers) config.sops.secrets != { }) {
|
|
||||||
setupSecretsForUsers.deps = [ "age-key" ];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
_module.args = { inherit self; };
|
|
||||||
# to accept external dependencies such as disko
|
|
||||||
node.specialArgs.self = self;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
)).config.result
|
|
||||||
@@ -25,6 +25,7 @@ lib.fix (clanLib: {
|
|||||||
buildClanModule = clanLib.callLib ./build-clan { };
|
buildClanModule = clanLib.callLib ./build-clan { };
|
||||||
inventory = clanLib.callLib ./inventory { };
|
inventory = clanLib.callLib ./inventory { };
|
||||||
modules = clanLib.callLib ./inventory/frontmatter { };
|
modules = clanLib.callLib ./inventory/frontmatter { };
|
||||||
|
test = clanLib.callLib ./tests { };
|
||||||
|
|
||||||
# Plain imports.
|
# Plain imports.
|
||||||
values = import ./introspection { inherit lib; };
|
values = import ./introspection { inherit lib; };
|
||||||
|
|||||||
92
lib/tests/default.nix
Normal file
92
lib/tests/default.nix
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
{ lib, clanLib }:
|
||||||
|
let
|
||||||
|
inherit (lib)
|
||||||
|
mkOption
|
||||||
|
types
|
||||||
|
;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
minifyModule = ./minify.nix;
|
||||||
|
# A function that returns an extension to runTest
|
||||||
|
makeTestClan =
|
||||||
|
{
|
||||||
|
nixosTest,
|
||||||
|
pkgs,
|
||||||
|
self,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
nixos-lib = import (pkgs.path + "/nixos/lib") { };
|
||||||
|
in
|
||||||
|
(nixos-lib.runTest (
|
||||||
|
{ config, ... }:
|
||||||
|
let
|
||||||
|
clanFlakeResult = config.clan;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [ nixosTest ];
|
||||||
|
options = {
|
||||||
|
clanSettings = mkOption {
|
||||||
|
default = { };
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
clan-core = mkOption { default = self; };
|
||||||
|
nixpkgs = mkOption { default = self.inputs.nixpkgs; };
|
||||||
|
nix-darwin = mkOption { default = self.inputs.nix-darwin; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
clan = mkOption {
|
||||||
|
default = { };
|
||||||
|
type = types.submoduleWith {
|
||||||
|
specialArgs = {
|
||||||
|
inherit (config.clanSettings)
|
||||||
|
clan-core
|
||||||
|
nixpkgs
|
||||||
|
nix-darwin
|
||||||
|
;
|
||||||
|
};
|
||||||
|
modules = [
|
||||||
|
clanLib.buildClanModule.flakePartsModule
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
nodes = clanFlakeResult.clanInternals.nixosModules;
|
||||||
|
hostPkgs = pkgs;
|
||||||
|
# speed-up evaluation
|
||||||
|
defaults = (
|
||||||
|
{ config, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
clanLib.test.minifyModule
|
||||||
|
];
|
||||||
|
documentation.enable = lib.mkDefault false;
|
||||||
|
nix.settings.min-free = 0;
|
||||||
|
system.stateVersion = config.system.nixos.release;
|
||||||
|
boot.initrd.systemd.enable = false;
|
||||||
|
|
||||||
|
# setup for sops
|
||||||
|
sops.age.keyFile = "/run/age-key.txt";
|
||||||
|
system.activationScripts =
|
||||||
|
{
|
||||||
|
setupSecrets.deps = [ "age-key" ];
|
||||||
|
age-key.text = ''
|
||||||
|
echo AGE-SECRET-KEY-1PL0M9CWRCG3PZ9DXRTTLMCVD57U6JDFE8K7DNVQ35F4JENZ6G3MQ0RQLRV > /run/age-key.txt
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
// lib.optionalAttrs (lib.filterAttrs (_: v: v.neededForUsers) config.sops.secrets != { }) {
|
||||||
|
setupSecretsForUsers.deps = [ "age-key" ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# to accept external dependencies such as disko
|
||||||
|
_module.args = { inherit self; };
|
||||||
|
node.specialArgs.self = self;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)).config.result;
|
||||||
|
}
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# This is a module to reduce the size of the NixOS configuration
|
||||||
|
# Used by the tests
|
||||||
|
# It unsets some unnecessary options
|
||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
{
|
{
|
||||||
nixpkgs.flake.setFlakeRegistry = false;
|
nixpkgs.flake.setFlakeRegistry = false;
|
||||||
Reference in New Issue
Block a user