about summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorSilvan Mosberger <contact@infinisil.com>2020-11-30 22:38:56 +0100
committerSilvan Mosberger <contact@infinisil.com>2020-12-17 21:52:24 +0100
commit767d80099cd8418b3cc7338eb24f9217fedb6449 (patch)
treedc6af45088e2c6f2e5fefa63034f7077f350ad6f /lib
parent991dfccbd1935aabb76a20245ca0108aadd38f3c (diff)
lib/modules: Introduce _module.checks.*.check
Previously the .enable option was used to encode the condition as well,
which lead to some oddness:
- In order to encode an assertion, one had to invert it
- To disable a check, one had to mkForce it

By introducing a separate .check option this is solved because:
- It can be used to encode assertions
- Disabling is done separately with .enable option, whose default can be
  overridden without a mkForce
Diffstat (limited to 'lib')
-rw-r--r--lib/modules.nix36
-rwxr-xr-xlib/tests/modules.sh3
-rw-r--r--lib/tests/modules/assertions/condition-true.nix8
-rw-r--r--lib/tests/modules/assertions/enable-false.nix1
-rw-r--r--lib/tests/modules/assertions/multi.nix8
-rw-r--r--lib/tests/modules/assertions/simple.nix2
-rw-r--r--lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix2
-rw-r--r--lib/tests/modules/assertions/submodule-attrsOf.nix2
-rw-r--r--lib/tests/modules/assertions/submodule.nix2
-rw-r--r--lib/tests/modules/assertions/underscore-attributes.nix2
-rw-r--r--lib/tests/modules/assertions/warning.nix2
11 files changed, 39 insertions, 29 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 23dbe962491ba..468c373d6aa4a 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -155,17 +155,22 @@ rec {
             default = {};
             internal = prefix != [];
             type = types.attrsOf (types.submodule {
-              # TODO: Rename to assertion? Or allow also setting assertion?
               options.enable = mkOption {
                 description = ''
-                  Whether to enable this check.
-                  <note><para>
-                    This is the inverse of asserting a condition: If a certain
-                    condition should be <literal>true</literal>, then this
-                    option should be set to <literal>false</literal> when that
-                    case occurs
-                  </para></note>
+                  Whether to enable this check. Set this to false to not trigger
+                  any errors or warning messages. This is useful for ignoring a
+                  check in case it doesn't make sense in certain scenarios.
                 '';
+                default = true;
+                type = types.bool;
+              };
+
+              options.check = mkOption {
+                description = ''
+                  The condition that must succeed in order for this check to be
+                  successful and not trigger a warning or error.
+                '';
+                readOnly = true;
                 type = types.bool;
               };
 
@@ -189,9 +194,7 @@ rec {
                   and use <literal>''${options.path.to.option}</literal>.
                 '';
                 type = types.str;
-                example = literalExample ''
-                  Enabling both ''${options.services.foo.enable} and ''${options.services.bar.enable} is not possible.
-                '';
+                example = "Enabling both \${options.services.foo.enable} and \${options.services.bar.enable} is not possible.";
               };
             });
           };
@@ -244,7 +247,7 @@ rec {
               if lib.hasPrefix "_" name then value.message
               else "[${showOption prefix}${optionalString (prefix != []) "/"}${name}] ${value.message}";
           in
-            if ! value.enable then errors
+            if value.enable -> value.check then errors
             else if value.type == "warning" then lib.warn show errors
             else if value.type == "error" then errors ++ [ show ]
             else abort "Unknown check type ${value.type}";
@@ -885,8 +888,7 @@ rec {
       });
       config._module.checks =
         let opt = getAttrFromPath optionName options; in {
-        ${showOption optionName} = {
-          enable = mkDefault opt.isDefined;
+        ${showOption optionName} = lib.mkIf opt.isDefined {
           message = ''
             The option definition `${showOption optionName}' in ${showFiles opt.files} no longer has any effect; please remove it.
             ${replacementInstructions}
@@ -958,8 +960,7 @@ rec {
             let val = getAttrFromPath f config;
                 opt = getAttrFromPath f options;
             in {
-              ${showOption f} = {
-                enable = mkDefault (val != "_mkMergedOptionModule");
+              ${showOption f} = lib.mkIf (val != "_mkMergedOptionModule") {
                 type = "warning";
                 message = "The option `${showOption f}' defined in ${showFiles opt.files} has been changed to `${showOption to}' that has a different type. Please read `${showOption to}' documentation and update your configuration accordingly.";
               };
@@ -1024,8 +1025,7 @@ rec {
       });
       config = mkMerge [
         {
-          _module.checks.${showOption from} = {
-            enable = mkDefault (warn && fromOpt.isDefined);
+          _module.checks.${showOption from} = mkIf (warn && fromOpt.isDefined) {
             type = "warning";
             message = "The option `${showOption from}' defined in ${showFiles fromOpt.files} has been renamed to `${showOption to}'.";
           };
diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh
index 9e85c90d15c55..775be9f7209bc 100755
--- a/lib/tests/modules.sh
+++ b/lib/tests/modules.sh
@@ -279,7 +279,8 @@ checkConfigOutput baz config.value.nested.bar.baz ./types-anything/mk-mods.nix
 # Check that assertions are triggered by default for just evaluating config
 checkConfigError 'Failed checks:\n- \[test\] Assertion failed' config ./assertions/simple.nix
 
-# Assertion is not triggered when enable is false
+# Assertion is not triggered when enable is false or condition is true
+checkConfigOutput '{ }' config ./assertions/condition-true.nix
 checkConfigOutput '{ }' config ./assertions/enable-false.nix
 
 # Warnings should be displayed on standard error
diff --git a/lib/tests/modules/assertions/condition-true.nix b/lib/tests/modules/assertions/condition-true.nix
new file mode 100644
index 0000000000000..7ca0817a23971
--- /dev/null
+++ b/lib/tests/modules/assertions/condition-true.nix
@@ -0,0 +1,8 @@
+{
+
+  _module.checks.test = {
+    check = true;
+    message = "Assertion failed";
+  };
+
+}
diff --git a/lib/tests/modules/assertions/enable-false.nix b/lib/tests/modules/assertions/enable-false.nix
index c326c086f03f2..11f753bb32e81 100644
--- a/lib/tests/modules/assertions/enable-false.nix
+++ b/lib/tests/modules/assertions/enable-false.nix
@@ -2,6 +2,7 @@
 
   _module.checks.test = {
     enable = false;
+    check = false;
     message = "Assertion failed";
   };
 
diff --git a/lib/tests/modules/assertions/multi.nix b/lib/tests/modules/assertions/multi.nix
index ebbe17f3a5584..1e2e14b8643a4 100644
--- a/lib/tests/modules/assertions/multi.nix
+++ b/lib/tests/modules/assertions/multi.nix
@@ -2,20 +2,20 @@
 
   _module.checks = {
     test1 = {
-      enable = true;
+      check = false;
       message = "Assertion 1 failed";
     };
     test2 = {
-      enable = true;
+      check = false;
       message = "Assertion 2 failed";
     };
     test3 = {
-      enable = true;
+      check = false;
       message = "Warning 3 failed";
       type = "warning";
     };
     test4 = {
-      enable = true;
+      check = false;
       message = "Warning 4 failed";
       type = "warning";
     };
diff --git a/lib/tests/modules/assertions/simple.nix b/lib/tests/modules/assertions/simple.nix
index a63b8090f9109..115d89a303622 100644
--- a/lib/tests/modules/assertions/simple.nix
+++ b/lib/tests/modules/assertions/simple.nix
@@ -1,6 +1,6 @@
 {
   _module.checks.test = {
-    enable = true;
+    check = false;
     message = "Assertion failed";
   };
 }
diff --git a/lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix b/lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix
index a5f92aa93c7d7..27a63d1e4329c 100644
--- a/lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix
+++ b/lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix
@@ -4,7 +4,7 @@
     default = { bar.baz = {}; };
     type = lib.types.attrsOf (lib.types.attrsOf (lib.types.submodule {
       _module.checks.test = {
-        enable = true;
+        check = false;
         message = "Assertion failed";
       };
     }));
diff --git a/lib/tests/modules/assertions/submodule-attrsOf.nix b/lib/tests/modules/assertions/submodule-attrsOf.nix
index 450cad0804dfe..aac5937cf7e59 100644
--- a/lib/tests/modules/assertions/submodule-attrsOf.nix
+++ b/lib/tests/modules/assertions/submodule-attrsOf.nix
@@ -4,7 +4,7 @@
     default = { bar = {}; };
     type = lib.types.attrsOf (lib.types.submodule {
       _module.checks.test = {
-        enable = true;
+        check = false;
         message = "Assertion failed";
       };
     });
diff --git a/lib/tests/modules/assertions/submodule.nix b/lib/tests/modules/assertions/submodule.nix
index a46734a326bfc..4e7e0b1bd61e9 100644
--- a/lib/tests/modules/assertions/submodule.nix
+++ b/lib/tests/modules/assertions/submodule.nix
@@ -4,7 +4,7 @@
     default = {};
     type = lib.types.submodule {
       _module.checks.test = {
-        enable = true;
+        check = false;
         message = "Assertion failed";
       };
     };
diff --git a/lib/tests/modules/assertions/underscore-attributes.nix b/lib/tests/modules/assertions/underscore-attributes.nix
index c28c9dcd9180e..f9ee5c5787b08 100644
--- a/lib/tests/modules/assertions/underscore-attributes.nix
+++ b/lib/tests/modules/assertions/underscore-attributes.nix
@@ -1,7 +1,7 @@
 {
 
   _module.checks._test = {
-    enable = true;
+    check = false;
     message = "Assertion failed";
   };
 
diff --git a/lib/tests/modules/assertions/warning.nix b/lib/tests/modules/assertions/warning.nix
index 8fed9871aa2c5..72598ba3fdd55 100644
--- a/lib/tests/modules/assertions/warning.nix
+++ b/lib/tests/modules/assertions/warning.nix
@@ -1,7 +1,7 @@
 {
 
   _module.checks.test = {
-    enable = true;
+    check = false;
     type = "warning";
     message = "Warning message";
   };