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; with lib;
{ {
options._module.features = 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"; description = "List of features exposed by module";
type = types.listOf types.str; type = types.listOf types.str;
default = []; default = [];
}; };
options.kubenix = { _module.propagate = mkOption {
project = mkOption { description = "Module propagation options";
description = "Name of the project"; type = types.listOf (types.submodule ({config, ...}: {
type = types.str; options = {
default = "kubenix"; 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 let
cfg = config.docker; cfg = config.docker;
in { in {
imports = [ ./base.nix ];
options.docker = { options.docker = {
registry.url = mkOption { registry.url = mkOption {
description = "Default registry url where images are published"; description = "Default registry url where images are published";
@ -70,13 +72,16 @@ in {
}; };
config = { config = {
# define docker feature
_module.features = ["docker"]; _module.features = ["docker"];
# pass docker library as param
_module.args.docker = import ../lib/docker.nix { inherit lib pkgs; }; _module.args.docker = import ../lib/docker.nix { inherit lib pkgs; };
submodules.defaults = [{ # propagate docker options if docker feature is enabled
_module.propagate = [{
features = [ "docker" ]; features = [ "docker" ];
default = { config, name, ... }: { module = { config, name, ... }: {
# propagate registry options # propagate registry options
docker.registry = cfg.registry; docker.registry = cfg.registry;
}; };

View file

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