diff --git a/examples/default.nix b/examples/default.nix index 555009e..b07c25c 100644 --- a/examples/default.nix +++ b/examples/default.nix @@ -1,5 +1,9 @@ -{ kubenix ? (import ./.. { }).default }: +{ system ? builtins.currentSystem +, evalModules ? (import ../. { }).evalModules.${system} +}: + +{ registry ? "docker.io/gatehub" }: { - nginx-deployment = import ./nginx-deployment { inherit kubenix; }; + nginx-deployment = import ./nginx-deployment { inherit evalModules registry; }; } diff --git a/examples/nginx-deployment/default.nix b/examples/nginx-deployment/default.nix index d47b1b0..42f1d96 100644 --- a/examples/nginx-deployment/default.nix +++ b/examples/nginx-deployment/default.nix @@ -1,30 +1,36 @@ -{ kubenix ? import ../.. { }, registry ? "docker.io/gatehub" }: +{ evalModules, registry }: -with kubenix.lib; - -rec { +let # evaluated configuration - config = (kubenix.evalModules { + config = (evalModules { modules = [ + + ({ kubenix, ... }: { imports = [ kubenix.modules.testing ]; }) + ./module.nix + { docker.registry.url = registry; } - kubenix.modules.testing { testing.tests = [ ./test.nix ]; - testing.defaults = ({ lib, ... }: with lib; { - docker.registry.url = mkForce ""; - kubernetes.version = config.kubernetes.version; - }); + testing.docker.registryUrl = ""; } + ]; }).config; - # e2e test - test = config.testing.result; +in +{ + inherit config; + + # config checks + checks = config.testing.success; + + # TODO: e2e test + # test = config.testing.result; # nixos test script for running the test - test-script = config.testing.testsByName.nginx-deployment.test; + test-script = config.testing.testsByName.nginx-deployment.script; # genreated kubernetes List object generated = config.kubernetes.generated; diff --git a/flake.nix b/flake.nix index 9b00cf2..a3fd895 100644 --- a/flake.nix +++ b/flake.nix @@ -21,9 +21,39 @@ config = { allowUnsupportedSystem = true; }; }; + lib = pkgs.lib; + + kubenix = { + lib = import ./lib { inherit lib pkgs; }; + evalModules = self.evalModules.${system}; + modules = self.modules; + }; + + # evalModules with same interface as lib.evalModules and kubenix as + # special argument + evalModules = attrs@{ module ? null, modules ? [ module ], ... }: + let + lib' = lib.extend (lib: self: import ./lib/upstreamables.nix { inherit lib pkgs; }); + attrs' = builtins.removeAttrs attrs [ "module" ]; + in + lib'.evalModules (lib.recursiveUpdate + { + inherit modules; + specialArgs = { inherit kubenix; }; + args = { + inherit pkgs; + name = "default"; + }; + } + attrs'); + in { + inherit evalModules; + + jobs = import ./jobs { inherit pkgs; }; + devShell = with pkgs; devshell.mkShell { imports = [ (devshell.importTOML ./devshell.toml) ]; }; @@ -31,9 +61,22 @@ inherit (pkgs) kubernetes kubectl; }; - defaultPackage = pkgs.kubenix; - - jobs = import ./jobs { inherit pkgs; }; + checks = let + wasSuccess = suite: + if suite.success == true + then pkgs.runCommandNoCC "testing-suite-config-assertions-for-${suite.name}-succeeded" {} "echo success > $out" + else pkgs.runCommandNoCC "testing-suite-config-assertions-for-${suite.name}-failed" {} "exit 1"; + mkExamples = attrs: (import ./examples { inherit evalModules; }) + ({ registry = "docker.io/gatehub"; } // attrs); + mkK8STests = attrs: (import ./tests { inherit evalModules; }) + ({ registry = "docker.io/gatehub"; } // attrs); + in { + # TODO: access "success" derivation with nice testing utils for nice output + nginx-example = wasSuccess (mkExamples { }).nginx-deployment.config.testing; + tests-k8s-1_19 = wasSuccess (mkK8STests { k8sVersion = "1.19"; }); + tests-k8s-1_20 = wasSuccess (mkK8STests { k8sVersion = "1.20"; }); + tests-k8s-1_21 = wasSuccess (mkK8STests { k8sVersion = "1.21"; }); + }; } )) @@ -41,9 +84,9 @@ // { - modules = import ./src/modules; + modules = import ./modules; overlay = final: prev: { - kubenix = prev.callPackage ./src/kubenix.nix { }; + kubenix.evalModules = self.evalModules.${prev.system}; # up to date versions of their nixpkgs equivalents kubernetes = prev.callPackage ./pkgs/applications/networking/cluster/kubernetes { }; diff --git a/src/lib/default.nix b/lib/default.nix similarity index 100% rename from src/lib/default.nix rename to lib/default.nix diff --git a/src/lib/docker/default.nix b/lib/docker/default.nix similarity index 100% rename from src/lib/docker/default.nix rename to lib/docker/default.nix diff --git a/src/lib/helm/chart2json.nix b/lib/helm/chart2json.nix similarity index 100% rename from src/lib/helm/chart2json.nix rename to lib/helm/chart2json.nix diff --git a/src/lib/helm/default.nix b/lib/helm/default.nix similarity index 100% rename from src/lib/helm/default.nix rename to lib/helm/default.nix diff --git a/src/lib/helm/fetchhelm.nix b/lib/helm/fetchhelm.nix similarity index 100% rename from src/lib/helm/fetchhelm.nix rename to lib/helm/fetchhelm.nix diff --git a/src/lib/helm/test.nix b/lib/helm/test.nix similarity index 100% rename from src/lib/helm/test.nix rename to lib/helm/test.nix diff --git a/src/lib/k8s/default.nix b/lib/k8s/default.nix similarity index 100% rename from src/lib/k8s/default.nix rename to lib/k8s/default.nix diff --git a/src/lib/upstreamables.nix b/lib/upstreamables.nix similarity index 100% rename from src/lib/upstreamables.nix rename to lib/upstreamables.nix diff --git a/src/modules/base.nix b/modules/base.nix similarity index 100% rename from src/modules/base.nix rename to modules/base.nix diff --git a/src/modules/default.nix b/modules/default.nix similarity index 100% rename from src/modules/default.nix rename to modules/default.nix diff --git a/src/modules/docker.nix b/modules/docker.nix similarity index 100% rename from src/modules/docker.nix rename to modules/docker.nix diff --git a/src/modules/generated/v1.19.nix b/modules/generated/v1.19.nix similarity index 100% rename from src/modules/generated/v1.19.nix rename to modules/generated/v1.19.nix diff --git a/src/modules/generated/v1.20.nix b/modules/generated/v1.20.nix similarity index 100% rename from src/modules/generated/v1.20.nix rename to modules/generated/v1.20.nix diff --git a/src/modules/generated/v1.21.nix b/modules/generated/v1.21.nix similarity index 100% rename from src/modules/generated/v1.21.nix rename to modules/generated/v1.21.nix diff --git a/src/modules/helm.nix b/modules/helm.nix similarity index 100% rename from src/modules/helm.nix rename to modules/helm.nix diff --git a/src/modules/istio-overrides.nix b/modules/istio-overrides.nix similarity index 100% rename from src/modules/istio-overrides.nix rename to modules/istio-overrides.nix diff --git a/src/modules/istio.nix b/modules/istio.nix similarity index 100% rename from src/modules/istio.nix rename to modules/istio.nix diff --git a/src/modules/k8s.nix b/modules/k8s.nix similarity index 100% rename from src/modules/k8s.nix rename to modules/k8s.nix diff --git a/src/modules/submodule.nix b/modules/submodule.nix similarity index 100% rename from src/modules/submodule.nix rename to modules/submodule.nix diff --git a/src/modules/submodules.nix b/modules/submodules.nix similarity index 100% rename from src/modules/submodules.nix rename to modules/submodules.nix diff --git a/src/modules/testing/default.nix b/modules/testing/default.nix similarity index 100% rename from src/modules/testing/default.nix rename to modules/testing/default.nix diff --git a/src/modules/testing/docker.nix b/modules/testing/docker.nix similarity index 100% rename from src/modules/testing/docker.nix rename to modules/testing/docker.nix diff --git a/src/modules/testing/driver/kubetest.nix b/modules/testing/driver/kubetest.nix similarity index 100% rename from src/modules/testing/driver/kubetest.nix rename to modules/testing/driver/kubetest.nix diff --git a/src/modules/testing/driver/kubetestdrv.nix b/modules/testing/driver/kubetestdrv.nix similarity index 100% rename from src/modules/testing/driver/kubetestdrv.nix rename to modules/testing/driver/kubetestdrv.nix diff --git a/src/modules/testing/evalTest.nix b/modules/testing/evalTest.nix similarity index 100% rename from src/modules/testing/evalTest.nix rename to modules/testing/evalTest.nix diff --git a/src/modules/testing/runtime/local.nix b/modules/testing/runtime/local.nix similarity index 100% rename from src/modules/testing/runtime/local.nix rename to modules/testing/runtime/local.nix diff --git a/src/modules/testing/runtime/nixos-k8s.nix b/modules/testing/runtime/nixos-k8s.nix similarity index 100% rename from src/modules/testing/runtime/nixos-k8s.nix rename to modules/testing/runtime/nixos-k8s.nix diff --git a/src/modules/testing/test-options.nix b/modules/testing/test-options.nix similarity index 100% rename from src/modules/testing/test-options.nix rename to modules/testing/test-options.nix diff --git a/release.nix b/release.nix deleted file mode 100644 index 0f1a947..0000000 --- a/release.nix +++ /dev/null @@ -1,33 +0,0 @@ -let - fetch = import ./lib/compat.nix; -in -{ pkgs ? import (fetch "nixpkgs") { } -, lib ? pkgs.lib -, throwError ? true -}: - -with lib; -let - kubenix = import ./. { inherit pkgs; }; - - lib = kubenix.lib; - - runK8STests = k8sVersion: import ./tests { - inherit pkgs lib kubenix k8sVersion throwError nixosPath; - }; -in -rec { - - tests = { - k8s-1_19 = runK8STests "1.19"; - k8s-1_20 = runK8STests "1.20"; - k8s-1_21 = runK8STests "1.21"; - }; - - test-check = - if !(all (test: test.success) (attrValues tests)) - then throw "tests failed" - else true; - - examples = import ./examples { }; -} diff --git a/src/kubenix.nix b/src/kubenix.nix deleted file mode 100644 index 240c07a..0000000 --- a/src/kubenix.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ pkgs, lib }: - -let - - kubenix = { - inherit evalModules; - lib = import ./lib { inherit lib pkgs; }; - modules = import ./modules; - }; - - defaultSpecialArgs = { - inherit kubenix; - }; - - # evalModules with same interface as lib.evalModules and kubenix as - # special argument - evalModules = - { module ? null - , modules ? [ module ] - , specialArgs ? defaultSpecialArgs - , ... - }@attrs: - let - lib' = lib.extend (lib: self: import ./lib/upstreamables.nix { inherit lib pkgs; }); - attrs' = builtins.removeAttrs attrs [ "module" ]; - in - lib'.evalModules (lib.recursiveUpdate - { - inherit specialArgs modules; - args = { - inherit pkgs; - name = "default"; - }; - } - attrs'); -in -kubenix diff --git a/tests/default.nix b/tests/default.nix index 9b26103..0e596cb 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -1,22 +1,21 @@ -{ pkgs ? import { } -, lib ? pkgs.lib -, kubenix ? (import ../. { }).default +{ system ? builtins.currentSystem +, evalModules ? (import ../. { }).evalModules.${system} +}: -, k8sVersion ? "1.21" -, registryUrl ? throw "Registry url not defined" +{ k8sVersion ? "1.21" +, registry ? throw "Registry url not defined" , throwError ? true # whether any testing error should throw an error , enabledTests ? null }: -with lib; let - images = pkgs.callPackage ./images.nix { }; + config = (evalModules { - config = (kubenix.evalModules { modules = [ - kubenix.modules.testing - { + ({ kubenix, ... }: { imports = [ kubenix.modules.testing ]; }) + + ({ pkgs, ... }: { testing = { name = "kubenix-${k8sVersion}"; throwError = throwError; @@ -38,9 +37,9 @@ let ./submodules/passthru.nix ]; args = { - inherit images; + images = pkgs.callPackage ./images.nix { }; }; - docker.registryUrl = registryUrl; + docker.registryUrl = registry; defaults = [ { features = [ "k8s" ]; @@ -50,14 +49,10 @@ let } ]; }; - } + }) + ]; - args = { - inherit pkgs; - }; - specialArgs = { - inherit kubenix; - }; + }).config; in -pkgs.recurseIntoAttrs config.testing +config.testing // { recurseForDerivations = true; }