nixos modules for convenient deployment of cloud resources
1{pkgs, lib ? pkgs.lib, self ? null, nixosSystem ? null}: let
2 l = lib;
3 mkProviderApp = provider:
4 l.concatStringsSep "\n" (l.flatten (
5 l.mapAttrsToList
6 (
7 name: module:
8 if module.enable
9 then ''
10 log info "deploying ${name} resource(s)..."
11 nu ${module.mkApp pkgs}
12 ''
13 else []
14 )
15 provider
16 ));
17 mkApp = {config, ...}: pkgs.writers.writeNu "deploy-resources" ''
18 use std/log
19 ${
20 l.concatStringsSep "\n\n"
21 (
22 l.mapAttrsToList
23 (
24 name: provider: ''
25 log info "deploying resources for ${name}..."
26 ${mkProviderApp provider}
27 ''
28 )
29 config.providers
30 )
31 }
32 '';
33in
34 if self != null
35 then
36 l.mergeAttrsList (
37 l.mapAttrsToList
38 (
39 hostname: host:
40 if l.hasAttr "providers" host.config
41 then {
42 "deploy-${hostname}-resources" = {
43 type = "app";
44 program = toString (mkApp host);
45 };
46 }
47 else {}
48 )
49 self.nixosConfigurations
50 )
51 else if nixosSystem != null
52 then
53 {
54 run = mkApp nixosSystem;
55 }
56 else
57 throw "nixos-cloud-resources: neither 'self' or 'nixosSystem' was provided, aborting"