mirror of
https://github.com/TECHNOFAB11/kubenix.git
synced 2025-12-12 08:00:06 +01:00
feat: make propagation independent of submodules
This commit is contained in:
parent
bdc145e2bb
commit
7afbc91301
4 changed files with 82 additions and 39 deletions
|
|
@ -3,17 +3,37 @@
|
||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
{
|
{
|
||||||
options._module.features = mkOption {
|
options = {
|
||||||
description = "List of features exposed by module";
|
kubenix.project = mkOption {
|
||||||
type = types.listOf types.str;
|
|
||||||
default = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
options.kubenix = {
|
|
||||||
project = mkOption {
|
|
||||||
description = "Name of the project";
|
description = "Name of the project";
|
||||||
type = types.str;
|
type = types.str;
|
||||||
default = "kubenix";
|
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 = [];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
};
|
|
||||||
}];
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 = {
|
[{
|
||||||
kubenix.project = parentConfig.kubenix.project;
|
default = {
|
||||||
};
|
kubenix.project = parentConfig.kubenix.project;
|
||||||
}];
|
};
|
||||||
|
}]
|
||||||
|
|
||||||
|
(map (propagate: {
|
||||||
|
features = propagate.features;
|
||||||
|
default = propagate.module;
|
||||||
|
}) config._module.propagate)
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
(mkIf cfg.propagate.enable {
|
(mkIf cfg.propagate.enable {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue