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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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