forked from DGNum/colmena
Merge nixpkgs.config
and nixpkgs.overlays
This replaces #12, and allows for Nixpkgs overlays and config to be overridden in machine configs. With #12, overlays set in machine configurations (`nixpkgs.overlays`) get silently ignored.
This commit is contained in:
parent
9eae937b42
commit
d16a13654c
2 changed files with 182 additions and 1 deletions
|
@ -243,9 +243,28 @@ let
|
||||||
in "Exactly one of `${prefix}.text`, `${prefix}.keyCommand` and `${prefix}.keyFile` must be set.";
|
in "Exactly one of `${prefix}.text`, `${prefix}.keyCommand` and `${prefix}.keyFile` must be set.";
|
||||||
}) config.deployment.keys;
|
}) config.deployment.keys;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Here we need to merge the configurations in meta.nixpkgs
|
||||||
|
# and in machine config.
|
||||||
|
nixpkgsModule = { config, lib, ... }: {
|
||||||
|
nixpkgs.overlays = lib.mkBefore npkgs.overlays;
|
||||||
|
nixpkgs.config = lib.mkOptionDefault npkgs.config;
|
||||||
|
|
||||||
|
# The merging of nixpkgs.config seems to be broken.
|
||||||
|
# Let's warn the user if not all config attributes set in
|
||||||
|
# meta.nixpkgs are overridden.
|
||||||
|
warnings = let
|
||||||
|
metaKeys = attrNames npkgs.config;
|
||||||
|
nodeKeys = attrNames config.nixpkgs.config;
|
||||||
|
remainingKeys = filter (k: ! elem k nodeKeys) metaKeys;
|
||||||
|
in
|
||||||
|
lib.optional (length remainingKeys != 0)
|
||||||
|
"The following Nixpkgs configuration keys set in meta.nixpkgs will be ignored: ${toString remainingKeys}";
|
||||||
|
};
|
||||||
in evalConfig {
|
in evalConfig {
|
||||||
modules = [
|
modules = [
|
||||||
assertionModule
|
assertionModule
|
||||||
|
nixpkgsModule
|
||||||
deploymentOptions
|
deploymentOptions
|
||||||
hive.defaults
|
hive.defaults
|
||||||
config
|
config
|
||||||
|
@ -253,7 +272,6 @@ let
|
||||||
specialArgs = {
|
specialArgs = {
|
||||||
inherit name nodes;
|
inherit name nodes;
|
||||||
modulesPath = npkgs.path + "/nixos/modules";
|
modulesPath = npkgs.path + "/nixos/modules";
|
||||||
pkgs = npkgs;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
163
src/nix/tests.rs
163
src/nix/tests.rs
|
@ -1,6 +1,7 @@
|
||||||
//! Integration-ish tests
|
//! Integration-ish tests
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use crate::progress::TaskProgress;
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
|
@ -56,6 +57,22 @@ impl TempHive {
|
||||||
let hive = Self::new(text);
|
let hive = Self::new(text);
|
||||||
assert!(block_on(hive.deployment_info()).is_err());
|
assert!(block_on(hive.deployment_info()).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Asserts that the specified nodes can be fully evaluated.
|
||||||
|
pub fn eval_success(text: &str, nodes: Vec<String>) {
|
||||||
|
let hive = Self::new(text);
|
||||||
|
let progress = TaskProgress::new("tests".to_string(), 5);
|
||||||
|
let (profiles, _) = block_on(hive.eval_selected(&nodes, progress));
|
||||||
|
assert!(profiles.is_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Asserts that the specified nodes will fail to evaluate.
|
||||||
|
pub fn eval_failure(text: &str, nodes: Vec<String>) {
|
||||||
|
let hive = Self::new(text);
|
||||||
|
let progress = TaskProgress::new("tests".to_string(), 5);
|
||||||
|
let (profiles, _) = block_on(hive.eval_selected(&nodes, progress));
|
||||||
|
assert!(profiles.is_err());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Deref for TempHive {
|
impl Deref for TempHive {
|
||||||
|
@ -210,3 +227,149 @@ fn test_parse_key_file() {
|
||||||
}
|
}
|
||||||
"#);
|
"#);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_eval_non_existent_pkg() {
|
||||||
|
// Sanity check
|
||||||
|
TempHive::eval_failure(r#"
|
||||||
|
{
|
||||||
|
test = { pkgs, ... }: {
|
||||||
|
boot.isContainer = true;
|
||||||
|
environment.systemPackages = with pkgs; [ thisPackageDoesNotExist ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
"#, vec![ "test".to_string() ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nixpkgs config tests
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_nixpkgs_overlay_meta_nixpkgs() {
|
||||||
|
// Only set overlays in meta.nixpkgs
|
||||||
|
TempHive::eval_success(r#"
|
||||||
|
{
|
||||||
|
meta = {
|
||||||
|
nixpkgs = import <nixpkgs> {
|
||||||
|
overlays = [
|
||||||
|
(self: super: { my-coreutils = super.coreutils; })
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
test = { pkgs, ... }: {
|
||||||
|
boot.isContainer = true;
|
||||||
|
environment.systemPackages = with pkgs; [ my-coreutils ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
"#, vec![ "test".to_string() ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_nixpkgs_overlay_node_config() {
|
||||||
|
// Only set overlays in node config
|
||||||
|
TempHive::eval_success(r#"
|
||||||
|
{
|
||||||
|
test = { pkgs, ... }: {
|
||||||
|
boot.isContainer = true;
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(self: super: { my-coreutils = super.coreutils; })
|
||||||
|
];
|
||||||
|
environment.systemPackages = with pkgs; [ my-coreutils ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
"#, vec![ "test".to_string() ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_nixpkgs_overlay_both() {
|
||||||
|
// Set overlays both in meta.nixpkgs and in node config
|
||||||
|
TempHive::eval_success(r#"
|
||||||
|
{
|
||||||
|
meta = {
|
||||||
|
nixpkgs = import <nixpkgs> {
|
||||||
|
overlays = [
|
||||||
|
(self: super: { meta-coreutils = super.coreutils; })
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
test = { pkgs, ... }: {
|
||||||
|
boot.isContainer = true;
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(self: super: { node-busybox = super.busybox; })
|
||||||
|
];
|
||||||
|
environment.systemPackages = with pkgs; [ meta-coreutils node-busybox ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
"#, vec![ "test".to_string() ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_nixpkgs_config_meta_nixpkgs() {
|
||||||
|
// Set config in meta.nixpkgs
|
||||||
|
TempHive::eval_success(r#"
|
||||||
|
{
|
||||||
|
meta = {
|
||||||
|
nixpkgs = import <nixpkgs> {
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
test = { pkgs, ... }: {
|
||||||
|
boot.isContainer = assert pkgs.config.allowUnfree; true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
"#, vec![ "test".to_string() ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_nixpkgs_config_node_config() {
|
||||||
|
// Set config in node config
|
||||||
|
TempHive::eval_success(r#"
|
||||||
|
{
|
||||||
|
test = { pkgs, ... }: {
|
||||||
|
nixpkgs.config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
};
|
||||||
|
boot.isContainer = assert pkgs.config.allowUnfree; true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
"#, vec![ "test".to_string() ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_nixpkgs_config_override() {
|
||||||
|
// Set same config both in meta.nixpkgs and in node config
|
||||||
|
let template = r#"
|
||||||
|
{
|
||||||
|
meta = {
|
||||||
|
nixpkgs = import <nixpkgs> {
|
||||||
|
config = {
|
||||||
|
allowUnfree = META_VAL;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
test = { pkgs, ... }: {
|
||||||
|
nixpkgs.config = {
|
||||||
|
allowUnfree = NODE_VAL;
|
||||||
|
};
|
||||||
|
boot.isContainer = assert pkgs.config.allowUnfree == EXPECTED_VAL; true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
|
||||||
|
TempHive::eval_success(
|
||||||
|
&template
|
||||||
|
.replace("META_VAL", "true")
|
||||||
|
.replace("NODE_VAL", "false")
|
||||||
|
.replace("EXPECTED_VAL", "false"),
|
||||||
|
vec![ "test".to_string() ]
|
||||||
|
);
|
||||||
|
|
||||||
|
TempHive::eval_success(
|
||||||
|
&template
|
||||||
|
.replace("META_VAL", "false")
|
||||||
|
.replace("NODE_VAL", "true")
|
||||||
|
.replace("EXPECTED_VAL", "true"),
|
||||||
|
vec![ "test".to_string() ]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue