This commit is contained in:
David Arnold 2021-05-13 17:27:08 -04:00
parent c3fa598922
commit db6d83c61e
No known key found for this signature in database
GPG key ID: 6D6A936E69C59D08
53 changed files with 1916 additions and 1599 deletions

View file

@ -3,7 +3,6 @@
{ options, config, pkgs, lib, kubenix, ... }:
with lib;
let
parentModule = module;
globalConfig = config;
@ -29,46 +28,50 @@ let
else if isAttrs mkOptionDefault.module then module // attrs
else module
);
in [
in
[
{
_module.args.name = module.name;
_module.args.module = module;
}
./k8s.nix
./legacy.nix
(injectModuleAttrs moduleDefinition.module {_file = file;})
(injectModuleAttrs moduleDefinition.module { _file = file; })
{
config.kubernetes.namespace = mkOptionDefault module.namespace;
config.kubenix.project = mkOptionDefault config.kubenix.project;
}
] ++ config.kubernetes.defaultModuleConfiguration.all
++ (optionals (hasAttr moduleDefinition.name config.kubernetes.defaultModuleConfiguration)
config.kubernetes.defaultModuleConfiguration.${moduleDefinition.name});
] ++ config.kubernetes.defaultModuleConfiguration.all
++ (optionals (hasAttr moduleDefinition.name config.kubernetes.defaultModuleConfiguration)
config.kubernetes.defaultModuleConfiguration.${moduleDefinition.name});
# prefix kubernetes objects with ${serviceName}, this magic was removed in new kubenix
prefixResources = resources: serviceName:
mapAttrs' (name: resource: nameValuePair "${serviceName}-${name}" resource) resources;
# TODO: rewrite using mkOptionType
defaultModuleConfigurationOptions = mapAttrs (name: moduleDefinition: mkOption {
description = "Module default configuration for ${name} module";
type = types.coercedTo types.unspecified (value: [value]) (types.listOf types.unspecified);
default = [];
apply = filter (v: v!=[]);
}) config.kubernetes.moduleDefinitions;
defaultModuleConfigurationOptions = mapAttrs
(name: moduleDefinition: mkOption {
description = "Module default configuration for ${name} module";
type = types.coercedTo types.unspecified (value: [ value ]) (types.listOf types.unspecified);
default = [ ];
apply = filter (v: v != [ ]);
})
config.kubernetes.moduleDefinitions;
getModuleDefinition = name:
if hasAttr name config.kubernetes.moduleDefinitions
then config.kubernetes.moduleDefinitions.${name}
else throw ''requested kubernetes moduleDefinition with name "${name}" does not exist'';
in {
in
{
imports = [ ./k8s.nix ];
options.kubernetes.moduleDefinitions = mkOption {
description = "Legacy kubenix attribute set of module definitions";
default = {};
type = types.attrsOf (types.submodule ({name, ...}: {
default = { };
type = types.attrsOf (types.submodule ({ name, ... }: {
options = {
name = mkOption {
description = "Module definition name";
@ -101,19 +104,19 @@ in {
options = defaultModuleConfigurationOptions // {
all = mkOption {
description = "Module default configuration for all modules";
type = types.coercedTo types.unspecified (value: [value]) (types.listOf types.unspecified);
default = [];
apply = filter (v: v != []);
type = types.coercedTo types.unspecified (value: [ value ]) (types.listOf types.unspecified);
default = [ ];
apply = filter (v: v != [ ]);
};
};
};
default = {};
default = { };
};
options.kubernetes.modules = mkOption {
description = "Legacy kubenix attribute set of modules";
default = {};
type = types.attrsOf (types.submodule ({config, name, ...}: {
default = { };
type = types.attrsOf (types.submodule ({ config, name, ... }: {
options = {
name = mkOption {
description = "Module name";
@ -130,17 +133,19 @@ in {
labels = mkOption {
description = "Attribute set of module lables";
type = types.attrsOf types.str;
default = {};
default = { };
};
configuration = mkOption {
description = "Module configuration";
type = submoduleWithSpecialArgs {
imports = mkModuleOptions (getModuleDefinition config.module) config;
} {
inherit kubenix;
};
default = {};
type = submoduleWithSpecialArgs
{
imports = mkModuleOptions (getModuleDefinition config.module) config;
}
{
inherit kubenix;
};
default = { };
};
module = mkOption {
@ -153,9 +158,9 @@ in {
};
options.kubernetes.defaults = mkOption {
type = types.attrsOf (types.coercedTo types.attrs (value: [value]) (types.listOf types.attrs));
type = types.attrsOf (types.coercedTo types.attrs (value: [ value ]) (types.listOf types.attrs));
description = "Legacy kubenix kubernetes defaults.";
default = {};
default = { };
};
# for back compatibility with kubernetes.customResources
@ -163,50 +168,63 @@ in {
config = {
kubernetes = mkMerge [{
api.defaults = mapAttrsToList (attrName: default: let
type = head (mapAttrsToList (_: v: v) (filterAttrs (_: type: type.attrName == attrName) config.kubernetes.api.types));
in {
default = { imports = default; };
} // (if (attrName == "all") then {} else {
resource = type.name;
})) config.kubernetes.defaults;
api.defaults = mapAttrsToList
(attrName: default:
let
type = head (mapAttrsToList (_: v: v) (filterAttrs (_: type: type.attrName == attrName) config.kubernetes.api.types));
in
{
default = { imports = default; };
} // (if (attrName == "all") then { } else {
resource = type.name;
}))
config.kubernetes.defaults;
resources = mkMerge (
mapAttrsToList (name: module:
mapAttrs' (_: type: let
moduleDefinition = getModuleDefinition module.module;
mapAttrsToList
(name: module:
mapAttrs'
(_: type:
let
moduleDefinition = getModuleDefinition module.module;
moduleResources = module.configuration.kubernetes.api.resources.${type.attrName} or {};
moduleResources = module.configuration.kubernetes.api.resources.${type.attrName} or { };
moduleConfig =
if moduleDefinition.prefixResources && type.kind != "CustomResourceDefinition"
then prefixResources (moduleToAttrs moduleResources) name
else moduleToAttrs moduleResources;
in nameValuePair type.attrName
(if moduleDefinition.assignAsDefaults
then mkAllDefault moduleConfig 1000
else moduleConfig)
) module.configuration.kubernetes.api.types
) config.kubernetes.modules
moduleConfig =
if moduleDefinition.prefixResources && type.kind != "CustomResourceDefinition"
then prefixResources (moduleToAttrs moduleResources) name
else moduleToAttrs moduleResources;
in
nameValuePair type.attrName
(if moduleDefinition.assignAsDefaults
then mkAllDefault moduleConfig 1000
else moduleConfig)
)
module.configuration.kubernetes.api.types
)
config.kubernetes.modules
);
# custom types created from customResourceDefinitions
customTypes =
mapAttrsToList (name: crd: {
group = crd.spec.group;
version = crd.spec.version;
kind = crd.spec.names.kind;
name = crd.spec.names.plural;
attrName = mkOptionDefault name;
}) (config.kubernetes.resources.customResourceDefinitions or {});
mapAttrsToList
(name: crd: {
group = crd.spec.group;
version = crd.spec.version;
kind = crd.spec.names.kind;
name = crd.spec.names.plural;
attrName = mkOptionDefault name;
})
(config.kubernetes.resources.customResourceDefinitions or { });
defaultModuleConfiguration.all = {
_file = head options.kubernetes.defaultModuleConfiguration.files;
config.kubernetes.version = mkDefault config.kubernetes.version;
config.kubernetes.moduleDefinitions = config.kubernetes.moduleDefinitions;
};
} {
resources = mkAliasDefinitions options.kubernetes.customResources;
}];
}
{
resources = mkAliasDefinitions options.kubernetes.customResources;
}];
};
}