diff --git a/examples/nginx-deployment/README.md b/examples/nginx-deployment/README.md index bc57e51..3510d42 100644 --- a/examples/nginx-deployment/README.md +++ b/examples/nginx-deployment/README.md @@ -5,10 +5,10 @@ image ## Usage -### Building and applying kubernetes yaml file +### Building and applying kubernetes configuration ``` -nix-instantiate --eval --strict --json -A listObject | kubectl apply -f - +nix-instantiate --eval --strict --json -A result | kubectl apply -f - ``` ### Building and pushing docker images @@ -16,3 +16,13 @@ nix-instantiate --eval --strict --json -A listObject | kubectl apply -f - ``` nix run -f ./. pushDockerImages -c copy-docker-images ``` + +### Running tests + +Test will spawn vm with kubernetes and run test script, which checks if everyting +works as expected. + +``` +nix build -f ./. test +cat result | jq '.' +``` diff --git a/examples/nginx-deployment/default.nix b/examples/nginx-deployment/default.nix index 1c59316..b3fd7db 100644 --- a/examples/nginx-deployment/default.nix +++ b/examples/nginx-deployment/default.nix @@ -1,26 +1,36 @@ -{ kubenix ? import ../.. {} }: +{ kubenix ? import ../.. {}, registry ? "docker.io/gatehub" }: with kubenix.lib; -let - registry = "docker.io/gatehub"; -in rec { +rec { # evaluated configuration config = (kubenix.evalModules { modules = [ ./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; + }); + } ]; }).config; - # list of kubernetes objects - objects = config.kubernetes.objects; + # e2e test + test = config.testing.result; + + # nixos test script for running the test + test-script = config.testing.testsByName.nginx-deployment.test; # hashed kubernetes List object - listObject = k8s.mkHashedList { items = config.kubernetes.objects; }; + result = k8s.mkHashedList { items = config.kubernetes.objects; }; # YAML file you can deploy to kubernetes - yaml = toYAML listObject; + yaml = toYAML k8s-result; # Exported docker images images = config.docker.export; diff --git a/examples/nginx-deployment/module.nix b/examples/nginx-deployment/module.nix index 645fd4c..e1da9fa 100644 --- a/examples/nginx-deployment/module.nix +++ b/examples/nginx-deployment/module.nix @@ -1,9 +1,9 @@ -{ config, lib, pkgs, test, kubenix, ... }: +{ config, lib, pkgs, kubenix, ... }: with lib; let - nginx = pkgs.callPackage ./image.nix { }; + nginx = pkgs.callPackage ./image.nix { }; in { imports = [ kubenix.module ]; @@ -23,8 +23,8 @@ in { volumeMounts."/etc/nginx".name = "config"; volumeMounts."/var/lib/html".name = "static"; }; - volumes.config.persistentVolumeClaim.claimName = "config"; - volumes.static.persistentVolumeClaim.claimName = "static"; + volumes.config.configMap.name = "nginx-config"; + volumes.static.configMap.name = "nginx-static"; }; }; }; diff --git a/examples/nginx-deployment/test.nix b/examples/nginx-deployment/test.nix new file mode 100644 index 0000000..b748296 --- /dev/null +++ b/examples/nginx-deployment/test.nix @@ -0,0 +1,20 @@ +{ config, lib, pkgs, kubenix, ... }: + +with lib; + +{ + imports = [ kubenix.modules.test ./module.nix ]; + + test = { + name = "nginx-deployment"; + description = "Test testing nginx deployment"; + testScript = '' + $kube->waitUntilSucceeds("docker load < ${config.docker.images.nginx.image}"); + $kube->waitUntilSucceeds("kubectl apply -f ${toYAML config.kubernetes.generated}"); + + $kube->succeed("kubectl get deployment | grep -i nginx"); + $kube->waitUntilSucceeds("kubectl get deployment -o go-template nginx --template={{.status.readyReplicas}} | grep 10"); + $kube->waitUntilSucceeds("${pkgs.curl}/bin/curl http://nginx.default.svc.cluster.local | grep -i hello"); + ''; + }; +}