From 5e292298792863f6ac72e94f5511e6ea3137594c Mon Sep 17 00:00:00 2001 From: Jaka Hudoklin Date: Fri, 5 Apr 2019 20:27:47 +0200 Subject: [PATCH] feat(k8s): support for yaml/json imports --- modules/k8s.nix | 59 ++++++++++++++++++++++++++------------- tests/default.nix | 1 + tests/k8s/deployment.yaml | 21 ++++++++++++++ tests/k8s/imports.nix | 30 ++++++++++++++++++++ tests/k8s/pod.json | 13 +++++++++ 5 files changed, 104 insertions(+), 20 deletions(-) create mode 100644 tests/k8s/deployment.yaml create mode 100644 tests/k8s/imports.nix create mode 100644 tests/k8s/pod.json diff --git a/modules/k8s.nix b/modules/k8s.nix index d07b640..5ddbf81 100644 --- a/modules/k8s.nix +++ b/modules/k8s.nix @@ -202,6 +202,12 @@ in { default = {}; }; + imports = mkOption { + type = types.listOf (types.either types.package types.path); + description = "List of resources to import"; + default = []; + }; + customResources = mkOption { default = []; description = "List of custom resource definitions to make API for"; @@ -272,9 +278,39 @@ in { _module.features = [ "k8s" ]; - kubernetes.api.resources = map (cr: { - inherit (cr) group version kind resource; - }) cfg.customResources; + kubernetes.api = mkMerge ([{ + resources = map (cr: { + 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 [ # gvk resources @@ -304,23 +340,6 @@ in { 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 = [{ features = [ "k8s" ]; default = { config, name, ... }: { diff --git a/tests/default.nix b/tests/default.nix index cac7ec7..c6c59e8 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -27,6 +27,7 @@ let ./k8s/defaults.nix ./k8s/order.nix ./k8s/submodule.nix + ./k8s/imports.nix ./helm/simple.nix ./istio/bookinfo.nix ./submodules/simple.nix diff --git a/tests/k8s/deployment.yaml b/tests/k8s/deployment.yaml new file mode 100644 index 0000000..f7f95de --- /dev/null +++ b/tests/k8s/deployment.yaml @@ -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 diff --git a/tests/k8s/imports.nix b/tests/k8s/imports.nix new file mode 100644 index 0000000..2e0a0c8 --- /dev/null +++ b/tests/k8s/imports.nix @@ -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 + ]; +} diff --git a/tests/k8s/pod.json b/tests/k8s/pod.json new file mode 100644 index 0000000..e586bc9 --- /dev/null +++ b/tests/k8s/pod.json @@ -0,0 +1,13 @@ +{ + "kind": "Pod", + "apiVersion": "v1", + "metadata": { + "name": "test" + }, + "spec": { + "containers": [{ + "name": "test", + "image": "busybox" + }] + } +}