From 26d0351eb8f7b133ee42b33af0095b55592a3560 Mon Sep 17 00:00:00 2001 From: Jaka Hudoklin Date: Mon, 21 Oct 2019 13:47:21 +0200 Subject: [PATCH] feat(legacy): improve CRD support --- modules/k8s.nix | 6 +-- modules/legacy.nix | 73 ++++++++++++++++---------------- tests/default.nix | 1 + tests/legacy/crd.nix | 89 ++++++++++++++++++++++++++++++++++++++++ tests/legacy/modules.nix | 10 ++--- 5 files changed, 134 insertions(+), 45 deletions(-) create mode 100644 tests/legacy/crd.nix diff --git a/modules/k8s.nix b/modules/k8s.nix index 0223b7b..dbe668d 100644 --- a/modules/k8s.nix +++ b/modules/k8s.nix @@ -169,7 +169,7 @@ let config = { apiVersion = mkOptionDefault "${ct.group}/${ct.version}"; kind = mkOptionDefault ct.kind; - metadata.name = mkOptionDefault name; + metadata.name = mkDefault name; }; }; @@ -384,12 +384,12 @@ in { # custom types created from customResourceDefinitions kubernetes.customTypes = mkIf cfg.createCustomTypesFromCRDs ( - mapAttrsToList (_: crd: { + mapAttrsToList (name: crd: { group = crd.spec.group; version = crd.spec.version; kind = crd.spec.names.kind; name = crd.spec.names.plural; - attrName = mkDefault crd.spec.names.plural; + attrName = mkOptionDefault name; }) (cfg.resources.customResourceDefinitions or {}) ); diff --git a/modules/legacy.nix b/modules/legacy.nix index 40051c2..9883507 100644 --- a/modules/legacy.nix +++ b/modules/legacy.nix @@ -6,6 +6,7 @@ with lib; let parentModule = module; + globalConfig = config; mkOptionDefault = mkOverride 1001; @@ -120,10 +121,7 @@ in { namespace = mkOption { description = "Namespace where to deploy module"; type = types.str; - default = - if parentModule != null - then parentModule.namespace - else "default"; + default = globalConfig.kubernetes.namespace; }; labels = mkOption { @@ -161,43 +159,44 @@ in { options.kubernetes.customResources = options.kubernetes.resources; config = { - kubernetes.api.defaults = mapAttrsToList (attrName: default: let - type = head (mapAttrsToList (_: v: v) (filterAttrs (_: type: type.attrName == attrName) config.kubernetes.api.types)); - in { - default = { imports = default; }; - } // (if (attrName == "all") then {} else { - resource = type.name; - })) config.kubernetes.defaults; + kubernetes = mkMerge [{ + api.defaults = mapAttrsToList (attrName: default: let + type = head (mapAttrsToList (_: v: v) (filterAttrs (_: type: type.attrName == attrName) config.kubernetes.api.types)); + in { + default = { imports = default; }; + } // (if (attrName == "all") then {} else { + resource = type.name; + })) config.kubernetes.defaults; - kubernetes.resources = mkMerge ( - mapAttrsToList (name: module: - mapAttrs' (_: type: let - moduleDefinition = getModuleDefinition module.module; + resources = mkMerge ( + mapAttrsToList (name: module: + mapAttrs' (_: type: let + moduleDefinition = getModuleDefinition module.module; - moduleResources = module.configuration.kubernetes.api.resources.${type.attrName} or {}; + moduleResources = module.configuration.kubernetes.api.resources.${type.attrName} or {}; - moduleConfig = - if moduleDefinition.prefixResources - then prefixResources (moduleToAttrs moduleResources) name - else moduleToAttrs moduleResources; - in nameValuePair type.attrName - (if moduleDefinition.assignAsDefaults - then mkAllDefault moduleConfig 1000 - else moduleConfig) - ) module.configuration.kubernetes.api.types - ) config.kubernetes.modules - ); + moduleConfig = + if moduleDefinition.prefixResources && type.kind != "CustomResourceDefinition" + then prefixResources (moduleToAttrs moduleResources) name + else moduleToAttrs moduleResources; + in nameValuePair type.attrName + (if moduleDefinition.assignAsDefaults + then mkAllDefault moduleConfig 1000 + else moduleConfig) + ) module.configuration.kubernetes.api.types + ) config.kubernetes.modules + ); - # custom resources are now included in normal resources, so just make an alias - kubernetes.customResources = mkAliasDefinitions options.kubernetes.resources; + # create custom types from CRDs was old behavior + createCustomTypesFromCRDs = true; - # create custom types from CRDs was old behavior - kubernetes.createCustomTypesFromCRDs = true; - - kubernetes.defaultModuleConfiguration.all = { - _file = head options.kubernetes.defaultModuleConfiguration.files; - config.kubernetes.version = mkDefault config.kubernetes.version; - config.kubernetes.moduleDefinitions = config.kubernetes.moduleDefinitions; - }; + defaultModuleConfiguration.all = { + _file = head options.kubernetes.defaultModuleConfiguration.files; + config.kubernetes.version = mkDefault config.kubernetes.version; + config.kubernetes.moduleDefinitions = config.kubernetes.moduleDefinitions; + }; + } { + resources = mkAliasDefinitions options.kubernetes.customResources; + }]; }; } diff --git a/tests/default.nix b/tests/default.nix index cf65d59..267d1b7 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -31,6 +31,7 @@ let ./k8s/submodule.nix ./k8s/imports.nix ./legacy/k8s.nix + ./legacy/crd.nix ./legacy/modules.nix ./helm/simple.nix ./istio/bookinfo.nix diff --git a/tests/legacy/crd.nix b/tests/legacy/crd.nix new file mode 100644 index 0000000..9b41955 --- /dev/null +++ b/tests/legacy/crd.nix @@ -0,0 +1,89 @@ +{ options, config, lib, kubenix, pkgs, k8sVersion, ... }: + +with lib; + +{ + imports = with kubenix.modules; [ test k8s legacy ]; + + test = { + name = "legacy-crd"; + description = "Simple test tesing kubenix legacy integration with crds crd"; + assertions = []; + }; + + kubernetes.version = k8sVersion; + kubernetes.namespace = "test"; + + kubernetes.moduleDefinitions.secret-claim.module = { config, k8s, module, ... }: { + options = { + name = mkOption { + description = "Name of the secret claim"; + type = types.str; + default = module.name; + }; + + type = mkOption { + description = "Type of the secret"; + type = types.enum ["Opaque" "kubernetes.io/tls"]; + default = "Opaque"; + }; + + path = mkOption { + description = "Secret path"; + type = types.str; + }; + + renew = mkOption { + description = "Renew time in seconds"; + type = types.nullOr types.int; + default = null; + }; + + data = mkOption { + type = types.nullOr types.attrs; + description = "Data to pass to get secrets"; + default = null; + }; + }; + + config = { + kubernetes.resources.customResourceDefinitions.secret-claims = { + kind = "CustomResourceDefinition"; + apiVersion = "apiextensions.k8s.io/v1beta1"; + metadata.name = "secretclaims.vaultproject.io"; + spec = { + group = "vaultproject.io"; + version = "v1"; + scope = "Namespaced"; + names = { + plural = "secretclaims"; + kind = "SecretClaim"; + shortNames = ["scl"]; + }; + }; + }; + + kubernetes.customResources.secret-claims.claim = { + metadata.name = config.name; + spec = { + inherit (config) type path; + } // (optionalAttrs (config.renew != null) { + inherit (config) renew; + }) // (optionalAttrs (config.data != null) { + inherit (config) data; + }); + }; + }; + }; + + kubernetes.modules.myclaim = { + module = "secret-claim"; + configuration.path = "tokens/test"; + }; + + kubernetes.customResources.secret-claims.propagated-claim = { + spec = { + path = "secrets/test2"; + }; + }; +} diff --git a/tests/legacy/modules.nix b/tests/legacy/modules.nix index 06d179b..41cbf08 100644 --- a/tests/legacy/modules.nix +++ b/tests/legacy/modules.nix @@ -17,11 +17,11 @@ in { name = "legacy-modules"; description = "Simple test tesing kubenix legacy modules"; assertions = [{ - message = "should have all objects"; - assertion = - hasObject {kind = "Deployment"; name = "myapp";} && - hasObject {kind = "Deployment"; name = "myapp2";} && - hasObject {kind = "Deployment"; name = "myapp2-app2";}; + message = "should have all objects"; + assertion = + hasObject {kind = "Deployment"; name = "myapp";} && + hasObject {kind = "Deployment"; name = "myapp2";} && + hasObject {kind = "Deployment"; name = "myapp2-app2";}; } { message = "should have default labels set"; assertion =