mirror of
https://github.com/TECHNOFAB11/kubenix.git
synced 2025-12-13 00:20:07 +01:00
feat(k8s): allow to specify custom defaults condition, add test
This commit is contained in:
parent
8536b03151
commit
bae2b8d3e6
11 changed files with 79 additions and 18 deletions
|
|
@ -126,6 +126,7 @@ in {
|
||||||
options.${cr.group}.${cr.version}.${cr.kind} = mkOption {
|
options.${cr.group}.${cr.version}.${cr.kind} = mkOption {
|
||||||
description = cr.description;
|
description = cr.description;
|
||||||
type = types.attrsOf (types.submodule ({name, ...}: {
|
type = types.attrsOf (types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults cr.resource cr.group cr.version cr.kind;
|
||||||
options = {
|
options = {
|
||||||
apiVersion = mkOption {
|
apiVersion = mkOption {
|
||||||
description = "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources";
|
description = "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources";
|
||||||
|
|
@ -149,11 +150,11 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkMerge ([{
|
config = {
|
||||||
apiVersion = mkOptionDefault "${cr.group}/${cr.version}";
|
apiVersion = mkOptionDefault "${cr.group}/${cr.version}";
|
||||||
kind = mkOptionDefault cr.kind;
|
kind = mkOptionDefault cr.kind;
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}] ++ (getDefaults cr.resource cr.group cr.version cr.kind));
|
};
|
||||||
}));
|
}));
|
||||||
default = {};
|
default = {};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -78,8 +78,9 @@ let
|
||||||
|
|
||||||
submoduleForDefinition = ref: resource: kind: group: version:
|
submoduleForDefinition = ref: resource: kind: group: version:
|
||||||
types.submodule ({name, ...}: {
|
types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults resource group version kind;
|
||||||
options = definitions."${ref}".options // extraOptions;
|
options = definitions."${ref}".options // extraOptions;
|
||||||
config = mkMerge ([
|
config = mkMerge [
|
||||||
definitions."${ref}".config
|
definitions."${ref}".config
|
||||||
{
|
{
|
||||||
kind = mkOptionDefault kind;
|
kind = mkOptionDefault kind;
|
||||||
|
|
@ -88,7 +89,7 @@ let
|
||||||
# metdata.name cannot use option default, due deep config
|
# metdata.name cannot use option default, due deep config
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}
|
}
|
||||||
] ++ (getDefaults resource group version kind));
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
||||||
|
|
|
||||||
|
|
@ -78,8 +78,9 @@ let
|
||||||
|
|
||||||
submoduleForDefinition = ref: resource: kind: group: version:
|
submoduleForDefinition = ref: resource: kind: group: version:
|
||||||
types.submodule ({name, ...}: {
|
types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults resource group version kind;
|
||||||
options = definitions."${ref}".options // extraOptions;
|
options = definitions."${ref}".options // extraOptions;
|
||||||
config = mkMerge ([
|
config = mkMerge [
|
||||||
definitions."${ref}".config
|
definitions."${ref}".config
|
||||||
{
|
{
|
||||||
kind = mkOptionDefault kind;
|
kind = mkOptionDefault kind;
|
||||||
|
|
@ -88,7 +89,7 @@ let
|
||||||
# metdata.name cannot use option default, due deep config
|
# metdata.name cannot use option default, due deep config
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}
|
}
|
||||||
] ++ (getDefaults resource group version kind));
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
||||||
|
|
|
||||||
|
|
@ -78,8 +78,9 @@ let
|
||||||
|
|
||||||
submoduleForDefinition = ref: resource: kind: group: version:
|
submoduleForDefinition = ref: resource: kind: group: version:
|
||||||
types.submodule ({name, ...}: {
|
types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults resource group version kind;
|
||||||
options = definitions."${ref}".options // extraOptions;
|
options = definitions."${ref}".options // extraOptions;
|
||||||
config = mkMerge ([
|
config = mkMerge [
|
||||||
definitions."${ref}".config
|
definitions."${ref}".config
|
||||||
{
|
{
|
||||||
kind = mkOptionDefault kind;
|
kind = mkOptionDefault kind;
|
||||||
|
|
@ -88,7 +89,7 @@ let
|
||||||
# metdata.name cannot use option default, due deep config
|
# metdata.name cannot use option default, due deep config
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}
|
}
|
||||||
] ++ (getDefaults resource group version kind));
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
||||||
|
|
|
||||||
|
|
@ -78,8 +78,9 @@ let
|
||||||
|
|
||||||
submoduleForDefinition = ref: resource: kind: group: version:
|
submoduleForDefinition = ref: resource: kind: group: version:
|
||||||
types.submodule ({name, ...}: {
|
types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults resource group version kind;
|
||||||
options = definitions."${ref}".options // extraOptions;
|
options = definitions."${ref}".options // extraOptions;
|
||||||
config = mkMerge ([
|
config = mkMerge [
|
||||||
definitions."${ref}".config
|
definitions."${ref}".config
|
||||||
{
|
{
|
||||||
kind = mkOptionDefault kind;
|
kind = mkOptionDefault kind;
|
||||||
|
|
@ -88,7 +89,7 @@ let
|
||||||
# metdata.name cannot use option default, due deep config
|
# metdata.name cannot use option default, due deep config
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}
|
}
|
||||||
] ++ (getDefaults resource group version kind));
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
||||||
|
|
|
||||||
|
|
@ -78,8 +78,9 @@ let
|
||||||
|
|
||||||
submoduleForDefinition = ref: resource: kind: group: version:
|
submoduleForDefinition = ref: resource: kind: group: version:
|
||||||
types.submodule ({name, ...}: {
|
types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults resource group version kind;
|
||||||
options = definitions."${ref}".options // extraOptions;
|
options = definitions."${ref}".options // extraOptions;
|
||||||
config = mkMerge ([
|
config = mkMerge [
|
||||||
definitions."${ref}".config
|
definitions."${ref}".config
|
||||||
{
|
{
|
||||||
kind = mkOptionDefault kind;
|
kind = mkOptionDefault kind;
|
||||||
|
|
@ -88,7 +89,7 @@ let
|
||||||
# metdata.name cannot use option default, due deep config
|
# metdata.name cannot use option default, due deep config
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}
|
}
|
||||||
] ++ (getDefaults resource group version kind));
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
||||||
|
|
|
||||||
|
|
@ -78,8 +78,9 @@ let
|
||||||
|
|
||||||
submoduleForDefinition = ref: resource: kind: group: version:
|
submoduleForDefinition = ref: resource: kind: group: version:
|
||||||
types.submodule ({name, ...}: {
|
types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults resource group version kind;
|
||||||
options = definitions."${ref}".options // extraOptions;
|
options = definitions."${ref}".options // extraOptions;
|
||||||
config = mkMerge ([
|
config = mkMerge [
|
||||||
definitions."${ref}".config
|
definitions."${ref}".config
|
||||||
{
|
{
|
||||||
kind = mkOptionDefault kind;
|
kind = mkOptionDefault kind;
|
||||||
|
|
@ -88,7 +89,7 @@ let
|
||||||
# metdata.name cannot use option default, due deep config
|
# metdata.name cannot use option default, due deep config
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}
|
}
|
||||||
] ++ (getDefaults resource group version kind));
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
||||||
|
|
|
||||||
|
|
@ -78,8 +78,9 @@ let
|
||||||
|
|
||||||
submoduleForDefinition = ref: resource: kind: group: version:
|
submoduleForDefinition = ref: resource: kind: group: version:
|
||||||
types.submodule ({name, ...}: {
|
types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults resource group version kind;
|
||||||
options = definitions."${ref}".options // extraOptions;
|
options = definitions."${ref}".options // extraOptions;
|
||||||
config = mkMerge ([
|
config = mkMerge [
|
||||||
definitions."${ref}".config
|
definitions."${ref}".config
|
||||||
{
|
{
|
||||||
kind = mkOptionDefault kind;
|
kind = mkOptionDefault kind;
|
||||||
|
|
@ -88,7 +89,7 @@ let
|
||||||
# metdata.name cannot use option default, due deep config
|
# metdata.name cannot use option default, due deep config
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}
|
}
|
||||||
] ++ (getDefaults resource group version kind));
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
||||||
|
|
|
||||||
|
|
@ -325,8 +325,9 @@ let
|
||||||
|
|
||||||
submoduleForDefinition = ref: resource: kind: group: version:
|
submoduleForDefinition = ref: resource: kind: group: version:
|
||||||
types.submodule ({name, ...}: {
|
types.submodule ({name, ...}: {
|
||||||
|
imports = getDefaults resource group version kind;
|
||||||
options = definitions.\"\${ref}\".options // extraOptions;
|
options = definitions.\"\${ref}\".options // extraOptions;
|
||||||
config = mkMerge ([
|
config = mkMerge [
|
||||||
definitions.\"\${ref}\".config
|
definitions.\"\${ref}\".config
|
||||||
{
|
{
|
||||||
kind = mkOptionDefault kind;
|
kind = mkOptionDefault kind;
|
||||||
|
|
@ -335,7 +336,7 @@ let
|
||||||
# metdata.name cannot use option default, due deep config
|
# metdata.name cannot use option default, due deep config
|
||||||
metadata.name = mkOptionDefault name;
|
metadata.name = mkOptionDefault name;
|
||||||
}
|
}
|
||||||
] ++ (getDefaults resource group version kind));
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ let
|
||||||
./k8s/crd.nix
|
./k8s/crd.nix
|
||||||
./k8s/1.13/crd.nix
|
./k8s/1.13/crd.nix
|
||||||
./k8s/submodule.nix
|
./k8s/submodule.nix
|
||||||
|
./k8s/defaults.nix
|
||||||
./submodules/simple.nix
|
./submodules/simple.nix
|
||||||
./submodules/defaults.nix
|
./submodules/defaults.nix
|
||||||
];
|
];
|
||||||
|
|
|
||||||
51
tests/k8s/defaults.nix
Normal file
51
tests/k8s/defaults.nix
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
{ config, lib, test, kubenix, k8s, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
with k8s;
|
||||||
|
|
||||||
|
let
|
||||||
|
pod1 = config.kubernetes.api.pods.pod1;
|
||||||
|
pod2 = config.kubernetes.api.pods.pod2;
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
kubenix.k8s
|
||||||
|
];
|
||||||
|
|
||||||
|
test = {
|
||||||
|
name = "k8s-defaults";
|
||||||
|
description = "Simple k8s testing wheter name, apiVersion and kind are preset";
|
||||||
|
assertions = [{
|
||||||
|
message = "Should have label set with resource";
|
||||||
|
assertion = pod1.metadata.labels.resource-label == "value";
|
||||||
|
} {
|
||||||
|
message = "Should have default label set with group, version, kind";
|
||||||
|
assertion = pod1.metadata.labels.gvk-label == "value";
|
||||||
|
} {
|
||||||
|
message = "Should have conditional annotation set";
|
||||||
|
assertion = pod2.metadata.annotations.conditional-annotation == "value";
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
|
||||||
|
kubernetes.api.pods.pod1 = {};
|
||||||
|
|
||||||
|
kubernetes.api.pods.pod2 = {
|
||||||
|
metadata.labels.custom-label = "value";
|
||||||
|
};
|
||||||
|
|
||||||
|
kubernetes.api.defaults = [{
|
||||||
|
resource = "pods";
|
||||||
|
default.metadata.labels.resource-label = "value";
|
||||||
|
} {
|
||||||
|
group = "core";
|
||||||
|
kind = "Pod";
|
||||||
|
version = "v1";
|
||||||
|
default.metadata.labels.gvk-label = "value";
|
||||||
|
} {
|
||||||
|
resource = "pods";
|
||||||
|
default = { config, ... }: {
|
||||||
|
config.metadata.annotations = mkIf (config.metadata.labels ? "custom-label") {
|
||||||
|
conditional-annotation = "value";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}];
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue