From e00079fb977a4d35832d6a9ea969a3c89b131026 Mon Sep 17 00:00:00 2001 From: Jaka Hudoklin Date: Thu, 28 Feb 2019 14:04:47 +0100 Subject: [PATCH] feat(k8s): explicit resource ordering --- k8s/default.nix | 18 ++++++++++++-- tests/default.nix | 1 + tests/k8s/order.nix | 57 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 tests/k8s/order.nix diff --git a/k8s/default.nix b/k8s/default.nix index 6e6f619..340d7b9 100644 --- a/k8s/default.nix +++ b/k8s/default.nix @@ -110,6 +110,9 @@ let }; }; }; + + indexOf = lst: value: + head (filter (v: v != -1) (imap0 (i: v: if v == value then i else -1) lst)); in { imports = [./lib.nix]; @@ -119,6 +122,15 @@ in { default = "1.13"; }; + options.kubernetes.resourceOrder = mkOption { + description = "Preffered resource order"; + type = types.listOf types.str; + default = [ + "CustomResourceDefinition" + "Namespace" + ]; + }; + options.kubernetes.api = mkOption { type = types.submodule { imports = [ @@ -207,13 +219,15 @@ in { config.kubernetes.api.resources = map (cr: { inherit (cr) group version kind resource; - }) config.kubernetes.customResources; + }) cfg.customResources; options.kubernetes.objects = mkOption { description = "Attribute set of kubernetes objects"; type = types.listOf types.attrs; apply = items: sort (r1: r2: - if r1.kind == "CustomResourceDefinition" || r2.kind == "CustomResourceDefinition" then true else false + if elem r1.kind cfg.resourceOrder && elem r2.kind cfg.resourceOrder + then indexOf cfg.resourceOrder r1.kind < indexOf cfg.resourceOrder r2.kind + else if elem r1.kind cfg.resourceOrder then true else false ) (moduleToAttrs (unique items)); default = []; }; diff --git a/tests/default.nix b/tests/default.nix index 0d02a8b..23ce2e3 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -32,6 +32,7 @@ let ./k8s/1.13/crd.nix ./k8s/submodule.nix ./k8s/defaults.nix + ./k8s/order.nix ./helm/simple.nix ./istio/bookinfo.nix ./submodules/simple.nix diff --git a/tests/k8s/order.nix b/tests/k8s/order.nix new file mode 100644 index 0000000..5079a9e --- /dev/null +++ b/tests/k8s/order.nix @@ -0,0 +1,57 @@ +{ config, lib, kubenix, pkgs, ... }: + +with lib; + +let + cfg = config.kubernetes.api.customresourcedefinitions.crontabs; +in { + imports = [ + kubenix.k8s + ]; + + test = { + name = "k8s-order"; + description = "test tesing k8s resource order"; + enable = builtins.compareVersions config.kubernetes.version "1.8" >= 0; + assertions = [{ + message = "should have correct order of resources"; + assertion = + (elemAt config.kubernetes.objects 0).kind == "CustomResourceDefinition" && + (elemAt config.kubernetes.objects 1).kind == "Namespace" && + (elemAt config.kubernetes.objects 2).kind == "CronTab"; + }]; + }; + + kubernetes.api.customresourcedefinitions.crontabs = { + metadata.name = "crontabs.stable.example.com"; + spec = { + group = "stable.example.com"; + version = "v1"; + scope = "Namespaced"; + names = { + plural = "crontabs"; + singular = "crontab"; + kind = "CronTab"; + shortNames = ["ct"]; + }; + }; + }; + + kubernetes.customResources = [{ + group = "stable.example.com"; + version = "v1"; + kind = "CronTab"; + resource = "crontabs"; + description = "CronTabs resources"; + module = { + options.schedule = mkOption { + description = "Crontab schedule script"; + type = types.str; + }; + }; + }]; + + kubernetes.api.namespaces.test = {}; + + kubernetes.api."stable.example.com"."v1".CronTab.crontab.spec.schedule = "* * * * *"; +}