feat(submodules): allow to match defaults by module version

This commit is contained in:
Jaka Hudoklin 2019-10-12 15:22:38 +02:00
parent 28d2b4baac
commit baea3cc3b3
No known key found for this signature in database
GPG key ID: D1F18234B07BD6E2
2 changed files with 47 additions and 14 deletions

View file

@ -6,16 +6,24 @@ let
cfg = config.submodules; cfg = config.submodules;
parentConfig = config; parentConfig = config;
getDefaults = {name, tags, features}: matchesVersion = requiredVersion: version:
catAttrs "default" (filter (submodule: if requiredVersion != null then
(submodule.name == null || submodule.name == name) && if hasPrefix "~" requiredVersion
then (builtins.match (removePrefix "~" requiredVersion) version) != null
else requiredVersion == version
else true;
getDefaults = {name, version, tags, features}:
catAttrs "default" (filter (submoduleDefault:
(submoduleDefault.name == null || submoduleDefault.name == name) &&
(matchesVersion submoduleDefault.version version) &&
( (
(length submodule.tags == 0) || (length submoduleDefault.tags == 0) ||
(length (intersectLists submodule.tags tags)) > 0 (length (intersectLists submoduleDefault.tags tags)) > 0
) && ) &&
( (
(length submodule.features == 0) || (length submoduleDefault.features == 0) ||
(length (intersectLists submodule.features features)) > 0 (length (intersectLists submoduleDefault.features features)) > 0
) )
) config.submodules.defaults); ) config.submodules.defaults);
@ -26,11 +34,7 @@ let
findSubmodule = {name, version ? null, latest ? true}: let findSubmodule = {name, version ? null, latest ? true}: let
matchingSubmodules = filter (el: matchingSubmodules = filter (el:
el.definition.name == name && el.definition.name == name &&
(if version != null then (matchesVersion version el.definition.version)
if hasPrefix "~" version
then (builtins.match (removePrefix "~" version) el.definition.version) != null
else el.definition.version == version
else true)
) cfg.imports; ) cfg.imports;
versionSortedSubmodules = sort (s1: s2: versionSortedSubmodules = sort (s1: s2:
@ -72,13 +76,22 @@ in {
type = types.listOf (types.submodule ({config, ...}: { type = types.listOf (types.submodule ({config, ...}: {
options = { options = {
name = mkOption { name = mkOption {
description = "Name of the submodule to apply defaults to"; description = "Name of the submodule to apply defaults for";
type = types.nullOr types.str;
default = null;
};
version = mkOption {
description = ''
Version of submodule to apply defaults for. If version starts with
"~" it is threated as regex pattern for example "~1.0.*
'';
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
}; };
tags = mkOption { tags = mkOption {
description = "List of tags to apply defaults to"; description = "List of tags to apply defaults for";
type = types.listOf types.str; type = types.listOf types.str;
default = []; default = [];
}; };
@ -181,6 +194,7 @@ in {
# submodule defaults # submodule defaults
defaults = getDefaults { defaults = getDefaults {
name = submoduleDefinition.name; name = submoduleDefinition.name;
version = submoduleDefinition.version;
tags = submoduleDefinition.tags; tags = submoduleDefinition.tags;
features = submodule.features; features = submodule.features;
}; };

View file

@ -8,6 +8,7 @@ let
instance3 = config.submodules.instances.instance3; instance3 = config.submodules.instances.instance3;
instance4 = config.submodules.instances.instance4; instance4 = config.submodules.instances.instance4;
instance5 = config.submodules.instances.instance5; instance5 = config.submodules.instances.instance5;
versioned-submodule = config.submodules.instances.versioned-submodule;
submodule = {name, ...}: { submodule = {name, ...}: {
imports = [ kubenix.modules.submodule ]; imports = [ kubenix.modules.submodule ];
@ -53,6 +54,9 @@ in {
} { } {
message = "should apply defaults by custom condition"; message = "should apply defaults by custom condition";
assertion = instance5.config.submodule.args.defaultValue == "my-custom-value"; assertion = instance5.config.submodule.args.defaultValue == "my-custom-value";
} {
message = "should apply defaults to versioned submodule";
assertion = versioned-submodule.config.submodule.args.defaultValue == "versioned-submodule";
}]; }];
}; };
@ -90,6 +94,13 @@ in {
}; };
submodule.args.value = "custom-value"; submodule.args.value = "custom-value";
}]; }];
} {
modules = [submodule {
submodule = {
name = "versioned-submodule";
version = "2.0.0";
};
}];
}]; }];
submodules.defaults = [{ submodules.defaults = [{
@ -107,6 +118,10 @@ in {
default = {config, ...}: { default = {config, ...}: {
submodule.args.defaultValue = mkIf (config.submodule.args.value == "custom-value") "my-custom-value"; submodule.args.defaultValue = mkIf (config.submodule.args.value == "custom-value") "my-custom-value";
}; };
} {
name = "versioned-submodule";
version = "2.0.0";
default.submodule.args.value = mkDefault "versioned";
}]; }];
submodules.instances.instance1.submodule = "submodule1"; submodules.instances.instance1.submodule = "submodule1";
@ -117,4 +132,8 @@ in {
}; };
submodules.instances.instance4.submodule = "submodule4"; submodules.instances.instance4.submodule = "submodule4";
submodules.instances.instance5.submodule = "submodule5"; submodules.instances.instance5.submodule = "submodule5";
submodules.instances.versioned-submodule = {
submodule = "versioned-submodule";
args.defaultValue = "versioned-submodule";
};
} }