diff --git a/k8s/default.nix b/k8s/default.nix index f3846df..db0cab3 100644 --- a/k8s/default.nix +++ b/k8s/default.nix @@ -126,6 +126,7 @@ in { options.${cr.group}.${cr.version}.${cr.kind} = mkOption { description = cr.description; type = types.attrsOf (types.submodule ({name, ...}: { + imports = getDefaults cr.resource cr.group cr.version cr.kind; options = { 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"; @@ -149,11 +150,11 @@ in { }; }; - config = mkMerge ([{ + config = { apiVersion = mkOptionDefault "${cr.group}/${cr.version}"; kind = mkOptionDefault cr.kind; metadata.name = mkOptionDefault name; - }] ++ (getDefaults cr.resource cr.group cr.version cr.kind)); + }; })); default = {}; }; diff --git a/k8s/generated/v1.10.nix b/k8s/generated/v1.10.nix index 99b4844..45a283e 100644 --- a/k8s/generated/v1.10.nix +++ b/k8s/generated/v1.10.nix @@ -78,8 +78,9 @@ let submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { + imports = getDefaults resource group version kind; options = definitions."${ref}".options // extraOptions; - config = mkMerge ([ + config = mkMerge [ definitions."${ref}".config { kind = mkOptionDefault kind; @@ -88,7 +89,7 @@ let # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (getDefaults resource group version kind)); + ]; }); coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo diff --git a/k8s/generated/v1.11.nix b/k8s/generated/v1.11.nix index 469057b..6856fbc 100644 --- a/k8s/generated/v1.11.nix +++ b/k8s/generated/v1.11.nix @@ -78,8 +78,9 @@ let submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { + imports = getDefaults resource group version kind; options = definitions."${ref}".options // extraOptions; - config = mkMerge ([ + config = mkMerge [ definitions."${ref}".config { kind = mkOptionDefault kind; @@ -88,7 +89,7 @@ let # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (getDefaults resource group version kind)); + ]; }); coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo diff --git a/k8s/generated/v1.12.nix b/k8s/generated/v1.12.nix index aa890db..b5d1e7b 100644 --- a/k8s/generated/v1.12.nix +++ b/k8s/generated/v1.12.nix @@ -78,8 +78,9 @@ let submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { + imports = getDefaults resource group version kind; options = definitions."${ref}".options // extraOptions; - config = mkMerge ([ + config = mkMerge [ definitions."${ref}".config { kind = mkOptionDefault kind; @@ -88,7 +89,7 @@ let # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (getDefaults resource group version kind)); + ]; }); coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo diff --git a/k8s/generated/v1.13.nix b/k8s/generated/v1.13.nix index 60f945d..c4e2482 100644 --- a/k8s/generated/v1.13.nix +++ b/k8s/generated/v1.13.nix @@ -78,8 +78,9 @@ let submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { + imports = getDefaults resource group version kind; options = definitions."${ref}".options // extraOptions; - config = mkMerge ([ + config = mkMerge [ definitions."${ref}".config { kind = mkOptionDefault kind; @@ -88,7 +89,7 @@ let # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (getDefaults resource group version kind)); + ]; }); coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo diff --git a/k8s/generated/v1.7.nix b/k8s/generated/v1.7.nix index 6c3b9f1..77ab7be 100644 --- a/k8s/generated/v1.7.nix +++ b/k8s/generated/v1.7.nix @@ -78,8 +78,9 @@ let submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { + imports = getDefaults resource group version kind; options = definitions."${ref}".options // extraOptions; - config = mkMerge ([ + config = mkMerge [ definitions."${ref}".config { kind = mkOptionDefault kind; @@ -88,7 +89,7 @@ let # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (getDefaults resource group version kind)); + ]; }); coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo diff --git a/k8s/generated/v1.8.nix b/k8s/generated/v1.8.nix index 57f2672..2733897 100644 --- a/k8s/generated/v1.8.nix +++ b/k8s/generated/v1.8.nix @@ -78,8 +78,9 @@ let submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { + imports = getDefaults resource group version kind; options = definitions."${ref}".options // extraOptions; - config = mkMerge ([ + config = mkMerge [ definitions."${ref}".config { kind = mkOptionDefault kind; @@ -88,7 +89,7 @@ let # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (getDefaults resource group version kind)); + ]; }); coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo diff --git a/k8s/generated/v1.9.nix b/k8s/generated/v1.9.nix index 897c8ac..0942f50 100644 --- a/k8s/generated/v1.9.nix +++ b/k8s/generated/v1.9.nix @@ -78,8 +78,9 @@ let submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { + imports = getDefaults resource group version kind; options = definitions."${ref}".options // extraOptions; - config = mkMerge ([ + config = mkMerge [ definitions."${ref}".config { kind = mkOptionDefault kind; @@ -88,7 +89,7 @@ let # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (getDefaults resource group version kind)); + ]; }); coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo diff --git a/k8s/generator.nix b/k8s/generator.nix index 3836758..1d4eb13 100644 --- a/k8s/generator.nix +++ b/k8s/generator.nix @@ -325,8 +325,9 @@ let submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { + imports = getDefaults resource group version kind; options = definitions.\"\${ref}\".options // extraOptions; - config = mkMerge ([ + config = mkMerge [ definitions.\"\${ref}\".config { kind = mkOptionDefault kind; @@ -335,7 +336,7 @@ let # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (getDefaults resource group version kind)); + ]; }); coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo diff --git a/tests/default.nix b/tests/default.nix index e3489c3..128aa66 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -31,6 +31,7 @@ let ./k8s/crd.nix ./k8s/1.13/crd.nix ./k8s/submodule.nix + ./k8s/defaults.nix ./submodules/simple.nix ./submodules/defaults.nix ]; diff --git a/tests/k8s/defaults.nix b/tests/k8s/defaults.nix new file mode 100644 index 0000000..07d9508 --- /dev/null +++ b/tests/k8s/defaults.nix @@ -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"; + }; + }; + }]; +}