confctl 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- # confctl-options.nix 8 2024-02-17 master
1
+ # confctl-options.nix 8 2024-05-07 master
2
2
 
3
3
  ## NAME
4
4
  `confctl-options.nix` - confctl configuration documentation
@@ -601,6 +601,22 @@ the deployment configuration directory, i.e. `cluster/<machine-name>/module.nix`
601
601
 
602
602
  *Declared by:* `<confctl/nix/modules/cluster>`
603
603
 
604
+ `cluster.<name>.buildAttribute`
605
+ Path to the attribute in machine system config that should be built
606
+
607
+ For example, `[ "system" "build" "toplevel" ]` will select attribute
608
+ `config.system.build.toplevel`.
609
+
610
+ *Type:* list of string
611
+
612
+ *Default:* `[
613
+ "system"
614
+ "build"
615
+ "toplevel"
616
+ ]`
617
+
618
+ *Declared by:* `<confctl/nix/modules/cluster>`
619
+
604
620
  `cluster.<name>.buildGenerations.max`
605
621
  The maximum number of build generations to be kept on the build
606
622
  machine.
@@ -634,6 +650,151 @@ the deployment configuration directory, i.e. `cluster/<machine-name>/module.nix`
634
650
 
635
651
  *Declared by:* `<confctl/nix/modules/cluster>`
636
652
 
653
+ `cluster.<name>.carrier.enable`
654
+ Whether to enable This machine is a carrier for other machines.
655
+
656
+ *Type:* boolean
657
+
658
+ *Default:* `false`
659
+
660
+ *Example:* `true`
661
+
662
+ *Declared by:* `<confctl/nix/modules/cluster>`
663
+
664
+ `cluster.<name>.carrier.machines`
665
+ List of carried machines
666
+
667
+ *Type:* list of (submodule)
668
+
669
+ *Default:* `[ ]`
670
+
671
+ *Declared by:* `<confctl/nix/modules/cluster>`
672
+
673
+ `cluster.<name>.carrier.machines.*.alias`
674
+ Alias for carried machine name
675
+
676
+ *Type:* null or string
677
+
678
+ *Default:* `null`
679
+
680
+ *Declared by:* `<confctl/nix/modules/cluster>`
681
+
682
+ `cluster.<name>.carrier.machines.*.buildAttribute`
683
+ Path to the attribute in machine system config that should be built
684
+
685
+ For example, `[ "system" "build" "toplevel" ]` will select attribute
686
+ `config.system.build.toplevel`.
687
+
688
+ *Type:* list of string
689
+
690
+ *Default:* `[
691
+ "system"
692
+ "build"
693
+ "toplevel"
694
+ ]`
695
+
696
+ *Declared by:* `<confctl/nix/modules/cluster>`
697
+
698
+ `cluster.<name>.carrier.machines.*.buildGenerations.max`
699
+ The maximum number of build generations to be kept on the build
700
+ machine.
701
+
702
+ *Type:* null or signed integer
703
+
704
+ *Default:* `null`
705
+
706
+ *Declared by:* `<confctl/nix/modules/cluster>`
707
+
708
+ `cluster.<name>.carrier.machines.*.buildGenerations.maxAge`
709
+ Delete build generations older than
710
+ `cluster.<name>.carrier.machines.*.buildGenerations.maxAge`
711
+ seconds from the build machine. Old generations are deleted even
712
+ if `cluster.<name>.carrier.machines.*.buildGenerations.max` is
713
+ not reached.
714
+
715
+ *Type:* null or signed integer
716
+
717
+ *Default:* `null`
718
+
719
+ *Declared by:* `<confctl/nix/modules/cluster>`
720
+
721
+ `cluster.<name>.carrier.machines.*.buildGenerations.min`
722
+ The minimum number of build generations to be kept on the build
723
+ machine.
724
+
725
+ *Type:* null or signed integer
726
+
727
+ *Default:* `null`
728
+
729
+ *Declared by:* `<confctl/nix/modules/cluster>`
730
+
731
+ `cluster.<name>.carrier.machines.*.extraModules`
732
+ A list of additional NixOS modules to be imported for this machine
733
+
734
+ *Type:* list of path
735
+
736
+ *Default:* `[ ]`
737
+
738
+ *Declared by:* `<confctl/nix/modules/cluster>`
739
+
740
+ `cluster.<name>.carrier.machines.*.hostGenerations.max`
741
+ The maximum number of generations to be kept on the machine.
742
+
743
+ *Type:* null or signed integer
744
+
745
+ *Default:* `null`
746
+
747
+ *Declared by:* `<confctl/nix/modules/cluster>`
748
+
749
+ `cluster.<name>.carrier.machines.*.hostGenerations.maxAge`
750
+ Delete generations older than
751
+ `cluster.<name>.carrier.machines.*.hostGenerations.maxAge`
752
+ seconds from the machine. Old generations are deleted even
753
+ if `cluster.<name>.carrier.machines.*.hostGenerations.max` is
754
+ not reached.
755
+
756
+ *Type:* null or signed integer
757
+
758
+ *Default:* `null`
759
+
760
+ *Declared by:* `<confctl/nix/modules/cluster>`
761
+
762
+ `cluster.<name>.carrier.machines.*.hostGenerations.min`
763
+ The minimum number of generations to be kept on the machine.
764
+
765
+ *Type:* null or signed integer
766
+
767
+ *Default:* `null`
768
+
769
+ *Declared by:* `<confctl/nix/modules/cluster>`
770
+
771
+ `cluster.<name>.carrier.machines.*.labels`
772
+ Optional user-defined labels to classify the machine
773
+
774
+ *Type:* attribute set
775
+
776
+ *Default:* `{ }`
777
+
778
+ *Declared by:* `<confctl/nix/modules/cluster>`
779
+
780
+ `cluster.<name>.carrier.machines.*.machine`
781
+ Machine name
782
+
783
+ *Type:* string
784
+
785
+ *Default:* `null`
786
+
787
+ *Declared by:* `<confctl/nix/modules/cluster>`
788
+
789
+ `cluster.<name>.carrier.machines.*.tags`
790
+ Optional user-defined tags to classify the machine
791
+
792
+ *Type:* list of string
793
+
794
+ *Default:* `[ ]`
795
+
796
+ *Declared by:* `<confctl/nix/modules/cluster>`
797
+
637
798
  `cluster.<name>.healthChecks.builderCommands`
638
799
  Check commands run on the build machine
639
800
 
@@ -1034,6 +1195,9 @@ the deployment configuration directory, i.e. `cluster/<machine-name>/module.nix`
1034
1195
 
1035
1196
  `cluster.<name>.host.target`
1036
1197
  Address/host to which the configuration is deployed to
1198
+
1199
+ Set to null if the machine is not deployable, e.g. when it is only used
1200
+ as a carried machine.
1037
1201
 
1038
1202
  *Type:* null or string
1039
1203
 
data/man/man8/confctl.8 CHANGED
@@ -113,6 +113,10 @@ generations can be managed using \fB\fCconfctl generation\fR command family.
113
113
  \fB\fC\-j\fR, \fB\fC\-\-max\-jobs\fR \fInumber\fP
114
114
  Maximum number of build jobs, passed to \fB\fCnix\-build\fR\&. See man
115
115
  .BR nix-build (1).
116
+ .PP
117
+ \fB\fC\-\-cores\fR \fInumber\fP
118
+ Number of CPU cores to use, passed to \fB\fCnix\-build\fR\&. See man
119
+ .BR nix-build (1).
116
120
  .TP
117
121
  \fB\fCconfctl deploy\fR [\fIoptions\fP] [\fImachine\-pattern\fP [\fB\fCboot\fR|\fB\fCswitch\fR|\fB\fCtest\fR|\fB\fCdry\-activate\fR]]
118
122
  Deploy either a new or an existing build generation to matching machines.
@@ -177,6 +181,10 @@ the target machine. The default action is \fB\fCswitch\fR\&.
177
181
  \fB\fC\-j\fR, \fB\fC\-\-max\-jobs\fR \fInumber\fP
178
182
  Maximum number of build jobs, passed to \fB\fCnix\-build\fR\&. See man
179
183
  .BR nix-build (1).
184
+ .PP
185
+ \fB\fC\-\-cores\fR \fInumber\fP
186
+ Number of CPU cores to use, passed to \fB\fCnix\-build\fR\&. See man
187
+ .BR nix-build (1).
180
188
  .PP
181
189
  \fB\fC\-\-no\-health\-checks\fR
182
190
  Do not run configured health checks. Health checks are run by default
@@ -226,6 +234,10 @@ Probe managed machines and determine their status.
226
234
  \fB\fC\-j\fR, \fB\fC\-\-max\-jobs\fR \fInumber\fP
227
235
  Maximum number of build jobs, passed to \fB\fCnix\-build\fR\&. See man
228
236
  .BR nix-build (1).
237
+ .PP
238
+ \fB\fC\-\-cores\fR \fInumber\fP
239
+ Number of CPU cores to use, passed to \fB\fCnix\-build\fR\&. See man
240
+ .BR nix-build (1).
229
241
  .TP
230
242
  \fB\fCconfctl changelog\fR [\fIoptions\fP] [\fImachine\-pattern\fP [\fIsw\-pattern\fP]]
231
243
  Show differences in deployed and configured software pins. For git software
@@ -270,6 +282,10 @@ itself, it works only on software pins.
270
282
  \fB\fC\-j\fR, \fB\fC\-\-max\-jobs\fR \fInumber\fP
271
283
  Maximum number of build jobs, passed to \fB\fCnix\-build\fR\&. See man
272
284
  .BR nix-build (1).
285
+ .PP
286
+ \fB\fC\-\-cores\fR \fInumber\fP
287
+ Number of CPU cores to use, passed to \fB\fCnix\-build\fR\&. See man
288
+ .BR nix-build (1).
273
289
  .TP
274
290
  \fB\fCconfctl diff\fR [\fIoptions\fP] [\fImachine\-pattern\fP [\fIsw\-pattern\fP]]
275
291
  Show differences in deployed and configured software pins. For git software
@@ -308,6 +324,10 @@ itself, it works only on software pins.
308
324
  \fB\fC\-j\fR, \fB\fC\-\-max\-jobs\fR \fInumber\fP
309
325
  Maximum number of build jobs, passed to \fB\fCnix\-build\fR\&. See man
310
326
  .BR nix-build (1).
327
+ .PP
328
+ \fB\fC\-\-cores\fR \fInumber\fP
329
+ Number of CPU cores to use, passed to \fB\fCnix\-build\fR\&. See man
330
+ .BR nix-build (1).
311
331
  .TP
312
332
  \fB\fCconfctl test\-connection\fR [\fIoptions\fP] [\fImachine\-pattern\fP]
313
333
  Try to open a SSH connection to the selected machines. This command can be
@@ -656,5 +676,5 @@ Report bugs to \[la]https://github.com/vpsfreecz/confctl/issues\[ra]\&.
656
676
  .SH ABOUT
657
677
  .PP
658
678
  \fB\fCconfctl\fR was originally developed for the purposes of
659
- vpsFree.cz \[la]https://vpsfree.org\[ra] and its cluster
679
+ vpsFree.cz \[la]https://vpsfree.org\[ra] and its cluster
660
680
  configuration \[la]https://github.com/vpsfreecz/vpsfree-cz-configuration\[ra]\&.
@@ -113,6 +113,9 @@ information.
113
113
  `-j`, `--max-jobs` *number*
114
114
  Maximum number of build jobs, passed to `nix-build`. See man nix-build(1).
115
115
 
116
+ `--cores` *number*
117
+ Number of CPU cores to use, passed to `nix-build`. See man nix-build(1).
118
+
116
119
  `confctl deploy` [*options*] [*machine-pattern* [`boot`|`switch`|`test`|`dry-activate`]]
117
120
  Deploy either a new or an existing build generation to matching machines.
118
121
 
@@ -176,6 +179,9 @@ information.
176
179
  `-j`, `--max-jobs` *number*
177
180
  Maximum number of build jobs, passed to `nix-build`. See man nix-build(1).
178
181
 
182
+ `--cores` *number*
183
+ Number of CPU cores to use, passed to `nix-build`. See man nix-build(1).
184
+
179
185
  `--no-health-checks`
180
186
  Do not run configured health checks. Health checks are run by default
181
187
  when *switch-action* is `switch`, `test` or `boot` with `--reboot`.
@@ -224,6 +230,9 @@ information.
224
230
  `-j`, `--max-jobs` *number*
225
231
  Maximum number of build jobs, passed to `nix-build`. See man nix-build(1).
226
232
 
233
+ `--cores` *number*
234
+ Number of CPU cores to use, passed to `nix-build`. See man nix-build(1).
235
+
227
236
  `confctl changelog` [*options*] [*machine-pattern* [*sw-pattern*]]
228
237
  Show differences in deployed and configured software pins. For git software
229
238
  pins, it's a git log.
@@ -267,6 +276,9 @@ information.
267
276
  `-j`, `--max-jobs` *number*
268
277
  Maximum number of build jobs, passed to `nix-build`. See man nix-build(1).
269
278
 
279
+ `--cores` *number*
280
+ Number of CPU cores to use, passed to `nix-build`. See man nix-build(1).
281
+
270
282
  `confctl diff` [*options*] [*machine-pattern* [*sw-pattern*]]
271
283
  Show differences in deployed and configured software pins. For git software
272
284
  pins, it's a git diff.
@@ -304,6 +316,9 @@ information.
304
316
  `-j`, `--max-jobs` *number*
305
317
  Maximum number of build jobs, passed to `nix-build`. See man nix-build(1).
306
318
 
319
+ `--cores` *number*
320
+ Number of CPU cores to use, passed to `nix-build`. See man nix-build(1).
321
+
307
322
  `confctl test-connection` [*options*] [*machine-pattern*]
308
323
  Try to open a SSH connection to the selected machines. This command can be
309
324
  used to confirm SSH host keys of the selected machines.
@@ -650,5 +665,5 @@ Report bugs to https://github.com/vpsfreecz/confctl/issues.
650
665
 
651
666
  ## ABOUT
652
667
  `confctl` was originally developed for the purposes of
653
- [vpsFree.cz](https://vpsfree.org) and its cluster
668
+ [vpsFree.cz](https://vpsfree.org) and its cluster
654
669
  [configuration](https://github.com/vpsfreecz/vpsfree-cz-configuration).
data/nix/evaluator.nix CHANGED
@@ -18,8 +18,8 @@ let
18
18
  nameValuePairs = builtins.map (m: {
19
19
  name = m.name;
20
20
  value = {
21
- inherit (m) name;
22
- } // m.config;
21
+ inherit (m) name alias clusterName carrier metaConfig;
22
+ };
23
23
  }) machines;
24
24
 
25
25
  machinesAttrs = builtins.listToAttrs nameValuePairs;
@@ -53,7 +53,7 @@ let
53
53
  import ./lib/swpins/eval.nix {
54
54
  inherit (arg) confDir;
55
55
  name = m.name;
56
- channels = m.config.swpins.channels;
56
+ channels = m.metaConfig.swpins.channels;
57
57
  pkgs = corePkgs.pkgs;
58
58
  lib = corePkgs.lib;
59
59
  };
@@ -70,17 +70,28 @@ let
70
70
  value = buildToplevel fullMachinesAttrs.${host};
71
71
  }) arg.machines);
72
72
 
73
- buildToplevel = m: (evalMachine m).config.system.build.toplevel;
73
+ buildToplevel = machine:
74
+ let
75
+ machineConfig = (evalMachine machine).config;
76
+
77
+ buildAttr = coreLib.attrByPath machine.build.attribute null machineConfig;
78
+
79
+ result =
80
+ if isNull buildAttr then
81
+ abort "Attribute 'config.${coreLib.concatStringsSep "." machine.build.attribute}' not found on machine ${machine.name}"
82
+ else
83
+ buildAttr;
84
+ in result;
74
85
 
75
- evalMachine = m:
86
+ evalMachine = machine:
76
87
  let
77
88
  importPath = {
78
89
  nixos = <nixpkgs/nixos/lib/eval-config.nix>;
79
90
  vpsadminos = <vpsadminos/os/default.nix>;
80
91
  };
81
92
 
82
- evalConfig = import importPath.${m.config.spin} {
83
- modules = [ m.build.toplevel ];
93
+ evalConfig = import importPath.${machine.metaConfig.spin} {
94
+ modules = machine.extraModules ++ [ machine.build.toplevel ];
84
95
  };
85
96
  in evalConfig;
86
97
 
data/nix/lib/default.nix CHANGED
@@ -1,29 +1,74 @@
1
1
  { confDir, coreLib, corePkgs }:
2
2
  with coreLib;
3
3
  let
4
- machine = import ./machine { inherit confDir corePkgs coreLib findConfig; };
4
+ machine = import ./machine { inherit confDir corePkgs coreLib findMetaConfig; };
5
5
 
6
- findConfig =
6
+ findMetaConfig =
7
7
  { cluster, name }:
8
8
  cluster.${name};
9
9
 
10
10
  makeMachine =
11
- { name, config }:
12
- {
13
- inherit name config;
14
- build.toplevel = buildConfig { inherit name config; };
11
+ { name, metaConfig, carrier ? null, alias ? null, clusterName ? null, extraModules ? [], buildAttribute ? null }:
12
+ let
13
+ ensuredClusterName = if isNull clusterName then name else clusterName;
14
+ in {
15
+ inherit name alias metaConfig carrier extraModules;
16
+ clusterName = ensuredClusterName;
17
+
18
+ build = {
19
+ attribute = if isNull buildAttribute then metaConfig.buildAttribute else buildAttribute;
20
+ toplevel = buildConfig { name = ensuredClusterName; inherit metaConfig; };
21
+ };
15
22
  };
16
23
 
17
24
  buildConfig =
18
- { name, config }:
19
- if !config.managed then
25
+ { name, metaConfig }:
26
+ if !metaConfig.managed then
20
27
  null
21
- else if config.spin == "nixos" then
22
- machine.nixos { inherit name config; }
23
- else if config.spin == "vpsadminos" then
24
- machine.vpsadminos { inherit name config; }
28
+ else if metaConfig.spin == "nixos" then
29
+ machine.nixos { inherit name metaConfig; }
30
+ else if metaConfig.spin == "vpsadminos" then
31
+ machine.vpsadminos { inherit name metaConfig; }
25
32
  else
26
33
  null;
34
+
35
+ expandCarriers = machineAttrs: flatten (mapAttrsToList (name: m:
36
+ if m.metaConfig.carrier.enable then
37
+ [ m ] ++ (expandCarrier machineAttrs m)
38
+ else
39
+ m
40
+ ) machineAttrs);
41
+
42
+ expandCarrier = machineAttrs: carrierMachine: map (cm:
43
+ makeMachine {
44
+ name = "${carrierMachine.name}#${if isNull cm.alias then cm.machine else cm.alias}";
45
+ alias = cm.alias;
46
+ clusterName = cm.machine;
47
+ carrier = carrierMachine.name;
48
+ extraModules = cm.extraModules;
49
+ buildAttribute = cm.buildAttribute;
50
+ metaConfig = coreLib.updateManyAttrsByPath ([
51
+ {
52
+ path = [ "labels" ];
53
+ update = old: old // cm.labels;
54
+ }
55
+ {
56
+ path = [ "tags" ];
57
+ update = old: old ++ cm.tags;
58
+ }
59
+ ] ++ (generationUpdates cm)) machineAttrs.${cm.machine}.metaConfig;
60
+ }
61
+ ) carrierMachine.metaConfig.carrier.machines;
62
+
63
+ generationUpdates = cm:
64
+ flatten (map (generations:
65
+ map (attr: {
66
+ path = [ generations attr ];
67
+ update = old:
68
+ let v = cm.${generations}.${attr};
69
+ in if isNull v then old else v;
70
+ }) [ "min" "max" "maxAge" ]
71
+ ) [ "buildGenerations" "hostGenerations" ]);
27
72
  in rec {
28
73
  inherit corePkgs coreLib;
29
74
 
@@ -35,20 +80,22 @@ in rec {
35
80
  mkNetUdevRule name mac
36
81
  ) rs);
37
82
 
38
- inherit findConfig;
83
+ inherit findMetaConfig;
39
84
 
40
85
  # Return all configured machines in a list
41
86
  getClusterMachines = cluster:
42
- mapAttrsToList (name: config:
43
- makeMachine { inherit name config; }
44
- ) cluster;
87
+ let
88
+ machineAttrs = mapAttrs (name: metaConfig:
89
+ makeMachine { inherit name metaConfig; }
90
+ ) cluster;
91
+ in expandCarriers machineAttrs;
45
92
 
46
93
  # Get IP version addresses from all machines in a cluster
47
94
  getAllAddressesOf = cluster: v:
48
95
  let
49
96
  machines = getClusterMachines cluster;
50
97
  addresses = flatten (map (machine:
51
- map (addr: machine // addr) machine.config.addresses.${"v${toString v}"}
98
+ map (addr: machine // addr) machine.metaConfig.addresses.${"v${toString v}"}
52
99
  ) machines);
53
100
  in addresses;
54
101
 
@@ -1,19 +1,19 @@
1
- { confDir, corePkgs, coreLib, findConfig }:
1
+ { confDir, corePkgs, coreLib, findMetaConfig }:
2
2
  let
3
3
  swpinsFor =
4
- { name, config }:
4
+ { name, metaConfig }:
5
5
  import ../swpins/eval.nix {
6
6
  inherit confDir name;
7
- channels = config.swpins.channels;
7
+ channels = metaConfig.swpins.channels;
8
8
  pkgs = corePkgs;
9
9
  lib = coreLib;
10
10
  };
11
11
 
12
12
  makeModuleArgs =
13
- { config, swpins, spin, name }@args: {
13
+ { metaConfig, swpins, spin, name }@args: {
14
14
  swpins = swpins.evaluated;
15
15
  swpinsInfo = swpins.infos;
16
- confMachine = import ./info.nix (args // { inherit findConfig; });
16
+ confMachine = import ./info.nix (args // { inherit findMetaConfig; });
17
17
  };
18
18
 
19
19
  makeImports = spin: extraImports: [
@@ -34,18 +34,20 @@ let
34
34
  lib.mkIf (confMachine.host != null) (lib.mkDefault confMachine.host.fullDomain);
35
35
  })
36
36
  ] ++ (import ../../modules/module-list.nix).${spin}
37
+ ++ (import ../../modules/system-list.nix).${spin}
37
38
  ++ (import "${toString confDir}/modules/module-list.nix").${spin}
38
39
  ++ (import "${toString confDir}/cluster/module-list.nix")
39
40
  ++ extraImports;
40
41
  in rec {
41
- nixos = { name, config }:
42
+ nixos = { name, metaConfig }:
42
43
  let
43
- swpins = swpinsFor { inherit name config; };
44
+ swpins = swpinsFor { inherit name metaConfig; };
44
45
  in
45
46
  { config, pkgs, ... }@args:
46
47
  {
47
48
  _module.args = makeModuleArgs {
48
- inherit config swpins;
49
+ metaConfig = config;
50
+ inherit swpins;
49
51
  spin = "nixos";
50
52
  inherit name;
51
53
  };
@@ -55,14 +57,15 @@ in rec {
55
57
  ];
56
58
  };
57
59
 
58
- vpsadminos = { name, config }:
60
+ vpsadminos = { name, metaConfig }:
59
61
  let
60
- swpins = swpinsFor { inherit name config; };
62
+ swpins = swpinsFor { inherit name metaConfig; };
61
63
  in
62
64
  { config, pkgs, ... }@args:
63
65
  {
64
66
  _module.args = makeModuleArgs {
65
- inherit config swpins;
67
+ metaConfig = config;
68
+ inherit swpins;
66
69
  spin = "vpsadminos";
67
70
  inherit name;
68
71
  };
@@ -1,5 +1,5 @@
1
- { config, spin, name, findConfig, ... }:
2
- ({ inherit name; } // findConfig {
3
- inherit (config) cluster;
1
+ { metaConfig, spin, name, findMetaConfig, ... }:
2
+ ({ inherit name; } // findMetaConfig {
3
+ inherit (metaConfig) cluster;
4
4
  inherit name;
5
5
  })