feat: make propagation independent of submodules

This commit is contained in:
Jaka Hudoklin 2019-10-06 21:30:20 +02:00
parent bdc145e2bb
commit 7afbc91301
No known key found for this signature in database
GPG key ID: D1F18234B07BD6E2
4 changed files with 82 additions and 39 deletions

View file

@ -3,17 +3,37 @@
with lib;
{
options._module.features = mkOption {
description = "List of features exposed by module";
type = types.listOf types.str;
default = [];
};
options.kubenix = {
project = mkOption {
options = {
kubenix.project = mkOption {
description = "Name of the project";
type = types.str;
default = "kubenix";
};
_module.features = mkOption {
description = "List of features exposed by module";
type = types.listOf types.str;
default = [];
};
_module.propagate = mkOption {
description = "Module propagation options";
type = types.listOf (types.submodule ({config, ...}: {
options = {
features = mkOption {
description = "List of features that submodule has to have to propagate module";
type = types.listOf types.str;
default = [];
};
module = mkOption {
description = "Module to propagate";
type = types.unspecified;
default = {};
};
};
}));
default = [];
};
};
}

View file

@ -5,6 +5,8 @@ with lib;
let
cfg = config.docker;
in {
imports = [ ./base.nix ];
options.docker = {
registry.url = mkOption {
description = "Default registry url where images are published";
@ -70,13 +72,16 @@ in {
};
config = {
# define docker feature
_module.features = ["docker"];
# pass docker library as param
_module.args.docker = import ../lib/docker.nix { inherit lib pkgs; };
submodules.defaults = [{
# propagate docker options if docker feature is enabled
_module.propagate = [{
features = [ "docker" ];
default = { config, name, ... }: {
module = { config, name, ... }: {
# propagate registry options
docker.registry = cfg.registry;
};

View file

@ -193,7 +193,7 @@ let
}) latestCustomResourceTypes);
in {
imports = [ ./base.nix ./submodules.nix ];
imports = [ ./base.nix ];
options.kubernetes = {
version = mkOption {
@ -299,8 +299,38 @@ in {
# expose k8s helper methods as module argument
_module.args.k8s = import ../lib/k8s.nix { inherit lib; };
# features that module is defining
_module.features = [ "k8s" ];
# module propagation options
_module.propagate = [{
features = ["k8s"];
module = { config, ... }: {
# propagate kubernetes version and namespace
kubernetes.version = mkDefault cfg.version;
kubernetes.namespace = mkDefault cfg.namespace;
};
} {
features = ["k8s" "submodule"];
module = { config, ... }: {
# set module defaults
kubernetes.api.defaults = (
# propagate defaults if default propagation is enabled
(filter (default: default.propagate) cfg.api.defaults) ++
[
# set module name and version for all kuberentes resources
{
default.metadata.labels = {
"kubenix/module-name" = config.submodule.name;
"kubenix/module-version" = config.submodule.version;
};
}
]
);
};
}];
kubernetes.api = mkMerge ([{
# register custom types
types = map (cr: {
@ -309,18 +339,11 @@ in {
defaults = [{
default = {
# set default kubernetes namespace to all resources
metadata.namespace = mkDefault config.kubernetes.namespace;
metadata.labels = mkMerge [
{
"kubenix/project-name" = config.kubenix.project;
}
# if we are inside submodule, define additional labels
(mkIf (elem "submodule" config._module.features) {
"kubenix/module-name" = config.submodule.name;
"kubenix/module-version" = config.submodule.version;
})
];
# set project name to all resources
metadata.labels."kubenix/project-name" = config.kubenix.project;
};
}];
}] ++
@ -360,17 +383,5 @@ in {
items = config.kubernetes.objects;
labels."kubenix/project-name" = config.kubenix.project;
};
submodules.defaults = [{
features = [ "k8s" ];
default = { config, name, ... }: {
# propagate kubernetes version and namespace
kubernetes.version = mkDefault cfg.version;
kubernetes.namespace = mkDefault cfg.namespace;
# propagate defaults if default propagation is enabled
kubernetes.api.defaults = filter (default: default.propagate) cfg.api.defaults;
};
}];
};
}

View file

@ -215,18 +215,25 @@ in {
default = {};
};
config = mkMerge [
config = mkMerge ([
{
_module.features = ["submodules"];
submodules.specialArgs.kubenix = kubenix;
# passthru kubenix.project to submodules
submodules.defaults = [{
default = {
kubenix.project = parentConfig.kubenix.project;
};
}];
submodules.defaults = mkMerge [
[{
default = {
kubenix.project = parentConfig.kubenix.project;
};
}]
(map (propagate: {
features = propagate.features;
default = propagate.module;
}) config._module.propagate)
];
}
(mkIf cfg.propagate.enable {