From 7afbc91301e5081bc5854fde7e9d97ac30b5ec56 Mon Sep 17 00:00:00 2001 From: Jaka Hudoklin Date: Sun, 6 Oct 2019 21:30:20 +0200 Subject: [PATCH] feat: make propagation independent of submodules --- modules/base.nix | 36 ++++++++++++++++++++------ modules/docker.nix | 9 +++++-- modules/k8s.nix | 57 +++++++++++++++++++++++++----------------- modules/submodules.nix | 19 +++++++++----- 4 files changed, 82 insertions(+), 39 deletions(-) diff --git a/modules/base.nix b/modules/base.nix index 22ee137..8e8517c 100644 --- a/modules/base.nix +++ b/modules/base.nix @@ -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 = []; + }; }; } diff --git a/modules/docker.nix b/modules/docker.nix index b9f3264..6b9f6d6 100644 --- a/modules/docker.nix +++ b/modules/docker.nix @@ -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; }; diff --git a/modules/k8s.nix b/modules/k8s.nix index 07b02e5..a72585c 100644 --- a/modules/k8s.nix +++ b/modules/k8s.nix @@ -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; - }; - }]; }; } diff --git a/modules/submodules.nix b/modules/submodules.nix index 4615edc..0081e04 100644 --- a/modules/submodules.nix +++ b/modules/submodules.nix @@ -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 {