feat(k8s): support for yaml/json imports

This commit is contained in:
Jaka Hudoklin 2019-04-05 20:27:47 +02:00
parent db5ee88274
commit 5e29229879
No known key found for this signature in database
GPG key ID: 916062A1C4748647
5 changed files with 104 additions and 20 deletions

View file

@ -202,6 +202,12 @@ in {
default = {}; default = {};
}; };
imports = mkOption {
type = types.listOf (types.either types.package types.path);
description = "List of resources to import";
default = [];
};
customResources = mkOption { customResources = mkOption {
default = []; default = [];
description = "List of custom resource definitions to make API for"; description = "List of custom resource definitions to make API for";
@ -272,9 +278,39 @@ in {
_module.features = [ "k8s" ]; _module.features = [ "k8s" ];
kubernetes.api.resources = map (cr: { kubernetes.api = mkMerge ([{
inherit (cr) group version kind resource; resources = map (cr: {
}) cfg.customResources; inherit (cr) group version kind resource;
}) cfg.customResources;
defaults = [{
default = {
metadata.namespace = mkDefault config.kubernetes.namespace;
metadata.labels = mkMerge [
{
"kubenix/project-name" = config.kubenix.project;
}
# if we are inside submodule, define additional labels
(mkIf (elem "submodule" config._module.features) {
"kubenix/module-name" = config.submodule.name;
"kubenix/module-version" = config.submodule.version;
})
];
};
}];
}] ++ (map (i: let
object = loadYAML i;
groupVersion = splitString "/" object.apiVersion;
name = object.metadata.name;
version = last groupVersion;
group =
if version == (head groupVersion)
then "core" else head groupVersion;
kind = object.kind;
in {
${group}.${version}.${kind}.${name} = object;
}) cfg.imports));
kubernetes.objects = mkMerge [ kubernetes.objects = mkMerge [
# gvk resources # gvk resources
@ -304,23 +340,6 @@ in {
labels."kubenix/project-name" = config.kubenix.project; labels."kubenix/project-name" = config.kubenix.project;
}; };
kubernetes.api.defaults = [{
default = {
metadata.namespace = mkDefault config.kubernetes.namespace;
metadata.labels = mkMerge [
{
"kubenix/project-name" = config.kubenix.project;
}
# if we are inside submodule, define additional labels
(mkIf (elem "submodule" config._module.features) {
"kubenix/module-name" = config.submodule.name;
"kubenix/module-version" = config.submodule.version;
})
];
};
}];
submodules.defaults = [{ submodules.defaults = [{
features = [ "k8s" ]; features = [ "k8s" ];
default = { config, name, ... }: { default = { config, name, ... }: {

View file

@ -27,6 +27,7 @@ let
./k8s/defaults.nix ./k8s/defaults.nix
./k8s/order.nix ./k8s/order.nix
./k8s/submodule.nix ./k8s/submodule.nix
./k8s/imports.nix
./helm/simple.nix ./helm/simple.nix
./istio/bookinfo.nix ./istio/bookinfo.nix
./submodules/simple.nix ./submodules/simple.nix

21
tests/k8s/deployment.yaml Normal file
View file

@ -0,0 +1,21 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

30
tests/k8s/imports.nix Normal file
View file

@ -0,0 +1,30 @@
{ config, lib, kubenix, k8sVersion, ... }:
with lib;
let
pod = config.kubernetes.api.core.v1.Pod.test;
deployment = config.kubernetes.api.apps.v1.Deployment.nginx-deployment;
in {
imports = with kubenix.modules; [ test k8s ];
test = {
name = "k8s-imports";
description = "Simple k8s testing imports";
enable = builtins.compareVersions config.kubernetes.version "1.10" >= 0;
assertions = [{
message = "Pod should have name set";
assertion = pod.metadata.name == "test";
} {
message = "Deployment should have name set";
assertion = deployment.metadata.name == "nginx-deployment";
}];
};
kubernetes.version = k8sVersion;
kubernetes.imports = [
./pod.json
./deployment.yaml
];
}

13
tests/k8s/pod.json Normal file
View file

@ -0,0 +1,13 @@
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "test"
},
"spec": {
"containers": [{
"name": "test",
"image": "busybox"
}]
}
}