Compare commits

..

25 commits

Author SHA1 Message Date
Max
956fba2e26 cluster/services/frangiclave: funny 2024-07-23 20:14:54 +02:00
Max
d502f3b7a8 packages/catalog: expose simulacrum checks differently 2024-07-23 20:14:54 +02:00
Max
692014a7a2 cluster/simulacrum: expose checks 2024-07-23 20:14:54 +02:00
Max
ae8bd7c757 cluster/services/forge: use forService 2024-07-23 20:14:54 +02:00
Max
fcceab694e cluster/services/attic: use forService 2024-07-23 20:14:54 +02:00
Max
d5cbf4cb42 cluster/lib: implement config.lib.forService for better option filtering 2024-07-23 20:14:54 +02:00
Max
d6cb790ea0 cluster/simulacrum: set testConfig 2024-07-23 20:14:54 +02:00
Max
3bed6efe70 cluster/lib: introduce testConfig 2024-07-23 20:14:54 +02:00
Max
71d8b07494 packages/catalog: don't use meta.description 2024-07-23 20:14:54 +02:00
Max
89ac9e3bfc cluster/services/frangiclave: test in simulacrum WIP 2024-07-23 20:14:54 +02:00
Max
18ed033e90 cluster/services/storage: test in simulacrum 2024-07-23 20:14:54 +02:00
Max
74f37bea00 cluster/services/consul: test in simulacrum 2024-07-23 20:14:54 +02:00
Max
97b870d288 cluster/services/wireguard: make simulacrum compatible 2024-07-23 20:14:54 +02:00
Max
cb8bc72452 cluster/catalog: support snakeoil secrets 2024-07-23 20:14:54 +02:00
Max
51a9788451 cluster/simulacrum: init 2024-07-23 20:14:54 +02:00
Max
13185f123a cluster/lib: implement simulacrum options 2024-07-23 20:14:54 +02:00
Max
a5540cf905 cluster/services/frangiclave: retry_join 2024-07-23 20:08:40 +02:00
Max
634ae84b13 cluster/services/frangiclave: some cluster stuff 2024-07-23 20:08:40 +02:00
Max
cf44319565 cluster/services/frangiclave: init trivial WIP 2024-07-23 20:08:40 +02:00
Max
836930a191 WIP ENABLE DEBUG MODE 2024-07-23 20:08:40 +02:00
Max
6aa6cd2f6b cluster/lib: implement injectNixosConfigForServices to select individual services 2024-07-23 20:08:40 +02:00
Max
faf51fa151 checks: add fake external storage module 2024-07-23 20:08:39 +02:00
Max
3500c0bbd6 checks: add a bunch of snakeoil keys 2024-07-23 19:37:32 +02:00
Max
93517391f4 VEGAS/database: drop 2024-07-23 19:37:18 +02:00
Max
effc773f54 cluster/services/sso: integrate VEGAS/oauth2-proxy 2024-07-23 19:37:11 +02:00
18 changed files with 98 additions and 93 deletions

View file

@ -2,6 +2,5 @@
imports = [
./services.nix
./secrets.nix
./simulacrum.nix
];
}

View file

@ -1,35 +0,0 @@
{ config, extendModules, lib, ... }:
let
inherit (config) cluster;
in
{
perSystem = { pkgs, ... }: {
catalog.cluster = {
simulacrum = lib.mapAttrs (name: svc: {
description = "Simulacrum test: ${name}";
actions = let
runSimulacrum = pkgs.callPackage ../simulacrum {
inherit config extendModules;
};
test = runSimulacrum {
service = name;
};
in {
build = {
description = "Build this test.";
command = "nix build -L --no-link '${builtins.unsafeDiscardStringContext test.drvPath}^*'";
};
runInteractive = {
description = "Run interactive driver.";
command = ''
${pkgs.bubblewrap}/bin/bwrap --unshare-all --bind / / --dev-bind /dev /dev ${lib.getExe test.driverInteractive}
'';
};
};
}) (lib.filterAttrs (_: svc: svc.simulacrum.enable) cluster.config.services);
};
};
}

View file

@ -17,6 +17,7 @@ lib.evalModules {
./lib/mesh.nix
./lib/secrets.nix
./lib/testing.nix
./lib/lib.nix
./import-services.nix
];

12
cluster/lib/lib.nix Normal file
View file

@ -0,0 +1,12 @@
{ config, lib, ... }:
{
options.lib = {
forService = lib.mkOption {
description = "Enable these definitions for a particular service only.";
type = lib.types.functionTo lib.types.raw;
readOnly = true;
default = service: lib.mkIf (!config.simulacrum || lib.any (s: s == service) config.testConfig.activeServices);
};
};
}

View file

@ -62,7 +62,7 @@ in
settings = mkOption {
description = "NixOS test configuration.";
type = types.deferredModule;
default.testScript = lib.mkDefault "assert False";
default = {};
};
augments = mkOption {
description = "Cluster augments (will be propagated).";

View file

@ -1,9 +1,15 @@
{ lib, ... }:
{
options.simulacrum = lib.mkOption {
description = "Whether we are in the Simulacrum.";
type = lib.types.bool;
default = false;
options = {
simulacrum = lib.mkOption {
description = "Whether we are in the Simulacrum.";
type = lib.types.bool;
default = false;
};
testConfig = lib.mkOption {
type = lib.types.attrs;
readOnly = true;
};
};
}

View file

@ -3,6 +3,7 @@
{
imports = [
./catalog
./simulacrum/checks.nix
];
options.cluster = lib.mkOption {

View file

@ -25,7 +25,7 @@
};
};
garage = {
garage = config.lib.forService "attic" {
keys.attic.locksmith = {
nodes = config.services.attic.nodes.server;
owner = "atticd";
@ -40,7 +40,7 @@
serverAddrs = map
(node: depot.hours.${node}.interfaces.primary.addrPublic)
config.services.attic.nodes.server;
in {
in config.lib.forService "attic" {
cache-api.target = serverAddrs;
cache.target = serverAddrs;
};

View file

@ -19,19 +19,21 @@
ways.forge.target = let
host = builtins.head config.services.forge.nodes.server;
in config.hostLinks.${host}.forge.url;
in config.lib.forService "forge" config.hostLinks.${host}.forge.url;
garage = {
garage = config.lib.forService "forge" {
keys.forgejo.locksmith.nodes = config.services.forge.nodes.server;
buckets.forgejo.allow.forgejo = [ "read" "write" ];
};
monitoring.blackbox.targets.forge = {
monitoring.blackbox.targets.forge = config.lib.forService "forge" {
address = "https://forge.${depot.lib.meta.domain}/api/v1/version";
module = "https2xx";
};
dns.records."ssh.forge".target = map
(node: depot.hours.${node}.interfaces.primary.addrPublic)
config.services.forge.nodes.server;
dns.records = config.lib.forService "forge" {
"ssh.forge".target = map
(node: depot.hours.${node}.interfaces.primary.addrPublic)
config.services.forge.nodes.server;
};
}

View file

@ -7,4 +7,6 @@
environment.systemPackages = [ config.services.vault.package ];
};
};
testScript = "assert False";
}

View file

@ -2,8 +2,14 @@
{
services.sso = {
nodes.host = [ "VEGAS" ];
nixos.host = ./host.nix;
nodes = {
host = [ "VEGAS" ];
oauth2-proxy = [ "VEGAS" ];
};
nixos = {
host = ./host.nix;
oauth2-proxy = ./oauth2-proxy.nix;
};
};
dns.records = let

View file

@ -1,3 +1,6 @@
{ lib, config, ... }: {
config.environment.etc."dummy-secrets/cluster-wireguard-meshPrivateKey".source = lib.mkForce ./keys/snakeoilPrivateKey-${config.networking.hostName};
config.environment.etc = {
"dummy-secrets/cluster-wireguard-meshPrivateKey".source = lib.mkForce ./keys/snakeoilPrivateKey-${config.networking.hostName};
"dummy-secrets/wireguard-key-storm".source = lib.mkForce ./keys/snakeoilPrivateKey-${config.networking.hostName};
};
}

View file

@ -0,0 +1,16 @@
{ config, extendModules, lib, ... }:
{
perSystem = { pkgs, ... }: {
checks = lib.mapAttrs' (name: svc: let
runSimulacrum = pkgs.callPackage ./. {
inherit config extendModules;
};
in {
name = "simulacrum-${name}";
value = runSimulacrum {
service = name;
};
}) (lib.filterAttrs (_: svc: svc.simulacrum.enable) config.cluster.config.services);
};
}

View file

@ -31,7 +31,13 @@ let
cluster = lib.mkForce (lift.cluster.extendModules {
specialArgs.depot = config;
modules = [
{ simulacrum = true; }
{
simulacrum = true;
testConfig = {
subject = service;
activeServices = serviceList;
};
}
];
});
})
@ -102,12 +108,6 @@ testers.runNixOSTest {
source = snakeoil.ssh.private;
mode = "0400";
};
"dummy-secrets/grafana-agent-blackbox-secret-monitoring".text = lib.mkForce ''
SECRET_MONITORING_BLACKBOX_TARGET_1_NAME=example-external-service
SECRET_MONITORING_BLACKBOX_TARGET_1_MODULE=http2xx
SECRET_MONITORING_BLACKBOX_TARGET_1_ADDRESS=http://127.0.0.1:1
'';
"dummy-secrets/garageRpcSecret".text = lib.mkForce "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
};
virtualisation = {
cores = 2;

View file

@ -1,17 +0,0 @@
{ lib, pkgs, ... }:
{
services.postgresql = {
enable = false;
enableTCPIP = true;
checkConfig = true;
package = pkgs.postgresql_12;
dataDir = "/srv/storage/database/postgres-12/data";
};
services.mysql = {
enable = false;
settings.mysqld.bind-address = "127.0.0.1";
package = pkgs.mariadb;
dataDir = "/srv/storage/database/mariadb/data";
};
}

View file

@ -7,8 +7,6 @@
./hardware-configuration.nix
# Plumbing
./modules/database
./modules/oauth2-proxy
./modules/redis
./modules/virtualisation
depot.inputs.agenix.nixosModules.age

View file

@ -1,21 +1,32 @@
{ lib, ... }:
{
perSystem = { config, ... }: {
catalog.depot = {
checks = lib.mapAttrs (name: check: {
description = "NixOS Test: ${name}";
actions = {
build = {
description = "Build this check.";
command = "nix build -L --no-link '${builtins.unsafeDiscardStringContext check.drvPath}^*'";
};
runInteractive = {
description = "Run interactive driver.";
command = lib.getExe check.driverInteractive;
};
perSystem = { config, pkgs, ... }: {
catalog = lib.mkMerge (lib.mapAttrsToList (name': check: let
simulacrum = lib.hasPrefix "simulacrum-" name';
name = lib.removePrefix "simulacrum-" name';
baseAttrPath = if simulacrum then
[ "cluster" "simulacrum" ]
else
[ "depot" "checks" ];
in lib.setAttrByPath (baseAttrPath ++ [ name ]) {
description = if simulacrum then
"Simulacrum Test: ${name}"
else
"NixOS Test: ${name}";
actions = {
build = {
description = "Build this check.";
command = "nix build -L --no-link '${builtins.unsafeDiscardStringContext check.drvPath}^*'";
};
}) config.checks;
};
runInteractive = {
description = "Run interactive driver.";
command = if simulacrum then
"${pkgs.bubblewrap}/bin/bwrap --unshare-all --bind / / --dev-bind /dev /dev ${lib.getExe check.driverInteractive}"
else
lib.getExe check.driverInteractive;
};
};
}) config.checks);
};
}