feat(k8s): allow to specify custom defaults condition, add test

This commit is contained in:
Jaka Hudoklin 2019-02-27 12:06:18 +01:00
parent 8536b03151
commit bae2b8d3e6
No known key found for this signature in database
GPG key ID: 6A08896BFD32BD95
11 changed files with 79 additions and 18 deletions

View file

@ -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 = {};
}; };

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
View 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";
};
};
}];
}