aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/nixos/tests/traefik.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/nixos/tests/traefik.nix')
-rw-r--r--nixpkgs/nixos/tests/traefik.nix87
1 files changed, 87 insertions, 0 deletions
diff --git a/nixpkgs/nixos/tests/traefik.nix b/nixpkgs/nixos/tests/traefik.nix
new file mode 100644
index 00000000000..0e21a7cf843
--- /dev/null
+++ b/nixpkgs/nixos/tests/traefik.nix
@@ -0,0 +1,87 @@
+# Test Traefik as a reverse proxy of a local web service
+# and a Docker container.
+import ./make-test-python.nix ({ pkgs, ... }: {
+ name = "traefik";
+ meta = with pkgs.stdenv.lib.maintainers; {
+ maintainers = [ joko ];
+ };
+
+ nodes = {
+ client = { config, pkgs, ... }: {
+ environment.systemPackages = [ pkgs.curl ];
+ };
+ traefik = { config, pkgs, ... }: {
+ docker-containers.nginx = {
+ extraDockerOptions = [
+ "-l" "traefik.enable=true"
+ "-l" "traefik.http.routers.nginx.entrypoints=web"
+ "-l" "traefik.http.routers.nginx.rule=Host(`nginx.traefik.test`)"
+ ];
+ image = "nginx-container";
+ imageFile = pkgs.dockerTools.examples.nginx;
+ };
+
+ networking.firewall.allowedTCPPorts = [ 80 ];
+
+ services.traefik = {
+ enable = true;
+
+ dynamicConfigOptions = {
+ http.routers.simplehttp = {
+ rule = "Host(`simplehttp.traefik.test`)";
+ entryPoints = [ "web" ];
+ service = "simplehttp";
+ };
+
+ http.services.simplehttp = {
+ loadBalancer.servers = [{
+ url = "http://127.0.0.1:8000";
+ }];
+ };
+ };
+
+ staticConfigOptions = {
+ global = {
+ checkNewVersion = false;
+ sendAnonymousUsage = false;
+ };
+
+ entryPoints.web.address = ":80";
+
+ providers.docker.exposedByDefault = false;
+ };
+ };
+
+ systemd.services.simplehttp = {
+ script = "${pkgs.python3}/bin/python -m http.server 8000";
+ serviceConfig.Type = "simple";
+ wantedBy = [ "multi-user.target" ];
+ };
+
+ users.users.traefik.extraGroups = [ "docker" ];
+ };
+ };
+
+ testScript = ''
+ start_all()
+
+ traefik.wait_for_unit("docker-nginx.service")
+ traefik.wait_until_succeeds("docker ps | grep nginx-container")
+ traefik.wait_for_unit("simplehttp.service")
+ traefik.wait_for_unit("traefik.service")
+ traefik.wait_for_open_port(80)
+ traefik.wait_for_unit("multi-user.target")
+
+ client.wait_for_unit("multi-user.target")
+
+ with subtest("Check that a container can be reached via Traefik"):
+ assert "Hello from NGINX" in client.succeed(
+ "curl -sSf -H Host:nginx.traefik.test http://traefik/"
+ )
+
+ with subtest("Check that dynamic configuration works"):
+ assert "Directory listing for " in client.succeed(
+ "curl -sSf -H Host:simplehttp.traefik.test http://traefik/"
+ )
+ '';
+})