diff --git a/services-agnostic/svnserve/default.nix b/services-agnostic/svnserve/default.nix index 7656015..d054543 100644 --- a/services-agnostic/svnserve/default.nix +++ b/services-agnostic/svnserve/default.nix @@ -21,9 +21,9 @@ createManagedProcess { ''} ''; process = "${subversion.out}/bin/svnserve"; - args = [ "-r" svnBaseDir "--listen-port" (toString port) ]; - foregroundProcessExtraArgs = [ "--foreground" ]; - daemonExtraArgs = [ "--daemon" "--pid-file" pidFile ]; + args = [ "-r" svnBaseDir "--listen-port" port "--daemon" ]; + foregroundProcessExtraArgs = ["--foreground" ]; + daemonExtraArgs = [ "--pid-file" pidFile ]; overrides = { sysvinit = { diff --git a/tests/apache-tomcat-ajp-reverse-proxy/default.nix b/tests/apache-tomcat-ajp-reverse-proxy/default.nix new file mode 100644 index 0000000..1d79841 --- /dev/null +++ b/tests/apache-tomcat-ajp-reverse-proxy/default.nix @@ -0,0 +1,25 @@ +{ pkgs, testService, processManagers, profiles }: + +testService { + exprFile = ./processes.nix; + + readiness = {instanceName, instance, stateDir, ...}: + if instanceName == "tomcat" then '' + machine.wait_for_open_port(${toString instance.httpPort}) + machine.wait_for_file("${stateDir}/tomcat/webapps/examples") + '' + else if instanceName == "apache" then '' + machine.wait_for_open_port(${toString instance.port}) + '' + else ""; + + tests = {instanceName, instance, ...}: + pkgs.lib.optionalString (instanceName == "apache") '' + machine.succeed("sleep 20") + machine.succeed( + "curl --fail http://localhost:${toString instance.port}/examples/servlets/servlet/HelloWorldExample | grep 'Hello World!'" + ) + ''; + + inherit processManagers profiles; +} diff --git a/tests/apache-tomcat-ajp-reverse-proxy/processes.nix b/tests/apache-tomcat-ajp-reverse-proxy/processes.nix new file mode 100644 index 0000000..1eefbba --- /dev/null +++ b/tests/apache-tomcat-ajp-reverse-proxy/processes.nix @@ -0,0 +1,41 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, libDir ? "${stateDir}/lib" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir libDir spoolDir forceDisableUserChange processManager; + }; +in +rec { + tomcat = rec { + ajpPort = 8009; + httpPort = 8080; + + pkg = constructors.simpleAppservingTomcat { + enableAJP = true; + inherit ajpPort httpPort; + }; + }; + + apache = rec { + port = if forceDisableUserChange then 8081 else 80; + + pkg = constructors.reverseProxyApache { + inherit port; + dependency = tomcat; + serverAdmin = "admin@localhost"; + targetProtocol = "ajp"; + portPropertyName = "ajpPort"; + }; + }; +} diff --git a/tests/apache-tomcat/default.nix b/tests/apache-tomcat/default.nix new file mode 100644 index 0000000..373ccf2 --- /dev/null +++ b/tests/apache-tomcat/default.nix @@ -0,0 +1,24 @@ +{ pkgs, testService, processManagers, profiles }: + +testService { + exprFile = ./processes.nix; + + nixosConfig = { + virtualisation.diskSize = 8192; + virtualisation.memorySize = 1024; + }; + + readiness = {instanceName, instance, ...}: + '' + machine.wait_for_open_port(${toString instance.httpPort}) + ''; + + tests = {instanceName, instance, ...}: + '' + machine.succeed( + "curl --fail http://localhost:${toString instance.httpPort}/examples/servlets/servlet/HelloWorldExample | grep 'Hello World!'" + ) + ''; + + inherit processManagers profiles; +} diff --git a/tests/apache-tomcat/processes.nix b/tests/apache-tomcat/processes.nix new file mode 100644 index 0000000..f9ce72a --- /dev/null +++ b/tests/apache-tomcat/processes.nix @@ -0,0 +1,43 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, libDir ? "${stateDir}/lib" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir libDir spoolDir forceDisableUserChange processManager; + }; +in +rec { + tomcat-primary = rec { + serverPort = 8005; + httpPort = 8080; + httpsPort = 8443; + ajpPort = 8009; + + pkg = constructors.simpleAppservingTomcat { + inherit serverPort httpPort httpsPort ajpPort; + instanceSuffix = "-primary"; + }; + }; + + tomcat-secondary = rec { + serverPort = 8006; + httpPort = 8081; + httpsPort = 8444; + ajpPort = 8010; + + pkg = constructors.simpleAppservingTomcat { + inherit serverPort httpPort httpsPort ajpPort; + instanceSuffix = "-secondary"; + }; + }; +} diff --git a/tests/apache/default.nix b/tests/apache/default.nix new file mode 100644 index 0000000..e111377 --- /dev/null +++ b/tests/apache/default.nix @@ -0,0 +1,17 @@ +{ pkgs, testService, processManagers, profiles }: + +testService { + exprFile = ./processes.nix; + + readiness = {instanceName, instance, ...}: + '' + machine.wait_for_open_port(${toString instance.port}) + ''; + + tests = {instanceName, instance, ...}: + '' + machine.succeed("curl --fail http://localhost:${toString instance.port} | grep 'Hello world!'") + ''; + + inherit processManagers profiles; +} diff --git a/tests/apache/processes.nix b/tests/apache/processes.nix new file mode 100644 index 0000000..25e4bbe --- /dev/null +++ b/tests/apache/processes.nix @@ -0,0 +1,84 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, libDir ? "${stateDir}/lib" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir libDir spoolDir forceDisableUserChange processManager; + }; + + webappStatic = pkgs.stdenv.mkDerivation { + name = "webapp-static"; + buildCommand = '' + mkdir -p $out + cat > $out/index.html < + + + + Hello + + + +

Hello world!

+ + + EOF + ''; + }; + + webappPHP = pkgs.stdenv.mkDerivation { + name = "webapp-php"; + buildCommand = '' + mkdir -p $out + cat > $out/index.php < + + + + Hello + + + +

+ + + EOF + ''; + }; +in +rec { + # The first instance only serves static web apps + apache-primary = rec { + port = if forceDisableUserChange then 8080 else 80; + + pkg = constructors.simpleWebappApache { + inherit port; + instanceSuffix = "-primary"; + serverAdmin = "root@localhost"; + documentRoot = webappStatic; + }; + }; + + # The second instance is PHP enabled + apache-secondary = rec { + port = if forceDisableUserChange then 8081 else 81; + + pkg = constructors.simpleWebappApache { + inherit port; + instanceSuffix = "-secondary"; + serverAdmin = "root@localhost"; + documentRoot = webappPHP; + enablePHP = true; + }; + }; +} diff --git a/tests/default.nix b/tests/default.nix new file mode 100644 index 0000000..63d7bb1 --- /dev/null +++ b/tests/default.nix @@ -0,0 +1,45 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, processManagers ? [ "supervisord" "sysvinit" "systemd" "docker" "disnix" "s6-rc" ] +, profiles ? [ "privileged" "unprivileged" ] +, nix-processmgmt ? ../../nix-processmgmt +}: + +let + testService = import "${nix-processmgmt}/nixproc/test-driver/universal.nix" { + inherit system; + }; +in +{ + apache = import ./apache { + inherit pkgs processManagers profiles testService; + }; + + apache-tomcat = import ./apache-tomcat { + inherit pkgs processManagers profiles testService; + }; + + apache-tomcat-ajp-reverse-proxy = import ./apache-tomcat-ajp-reverse-proxy { + inherit pkgs processManagers profiles testService; + }; + + influxdb = import ./influxdb { + inherit pkgs processManagers profiles testService; + }; + + mongodb = import ./mongodb { + inherit pkgs processManagers profiles testService; + }; + + mysql = import ./mysql { + inherit pkgs processManagers profiles testService; + }; + + postgresql = import ./postgresql { + inherit pkgs processManagers profiles testService; + }; + + svnserve = import ./svnserve { + inherit pkgs processManagers profiles testService; + }; +} diff --git a/tests/influxdb/default.nix b/tests/influxdb/default.nix new file mode 100644 index 0000000..d6ef5b2 --- /dev/null +++ b/tests/influxdb/default.nix @@ -0,0 +1,21 @@ +{ pkgs, testService, processManagers, profiles }: + +testService { + exprFile = ./processes.nix; + systemPackages = [ pkgs.influxdb ]; + + readiness = {instanceName, instance, ...}: + '' + machine.wait_for_open_port(${toString instance.httpPort}) + ''; + + tests = {instanceName, instance, runtimeDir, forceDisableUserChange, ...}: + # Make a special exception for the first instance running in privileged mode. It should be connectible with the default settings + if instanceName == "influxdb" && !forceDisableUserChange then '' + machine.succeed("influx -execute 'show databases' >&2") + '' else '' + machine.succeed("influx -execute 'show databases' --port ${toString instance.httpPort} >&2") + ''; + + inherit processManagers profiles; +} diff --git a/tests/influxdb/processes.nix b/tests/influxdb/processes.nix new file mode 100644 index 0000000..65ebbf2 --- /dev/null +++ b/tests/influxdb/processes.nix @@ -0,0 +1,38 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, libDir ? "${stateDir}/lib" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir spoolDir libDir forceDisableUserChange processManager; + }; +in +rec { + influxdb = rec { + rpcPort = 8088; + httpPort = 8086; + + pkg = constructors.simpleInfluxdb { + inherit rpcPort httpPort; + }; + }; + + influxdb-secondary = rec { + rpcPort = 8092; + httpPort = 8090; + + pkg = constructors.simpleInfluxdb { + inherit rpcPort httpPort; + instanceSuffix = "-secondary"; + }; + }; +} diff --git a/tests/mongodb/default.nix b/tests/mongodb/default.nix new file mode 100644 index 0000000..249656c --- /dev/null +++ b/tests/mongodb/default.nix @@ -0,0 +1,24 @@ +{ pkgs, testService, processManagers, profiles }: + +testService { + exprFile = ./processes.nix; + systemPackages = [ pkgs.mongodb ]; + nixosConfig = { + virtualisation.memorySize = 1024; + virtualisation.diskSize = 8192; + }; + readiness = {instanceName, instance, ...}: + '' + machine.wait_for_open_port(${toString instance.port}) + ''; + + tests = {instanceName, instance, runtimeDir, forceDisableUserChange, ...}: + # Make a special exception for the first instance running in privileged mode. It should be connectible with the default settings + if instanceName == "mongodb" && !forceDisableUserChange then '' + machine.succeed("echo 'show databases' | mongo >&2") + '' else '' + machine.succeed("echo 'show databases' | mongo --port ${toString instance.port} >&2") + ''; + + inherit processManagers profiles; +} diff --git a/tests/mongodb/processes.nix b/tests/mongodb/processes.nix new file mode 100644 index 0000000..3b67050 --- /dev/null +++ b/tests/mongodb/processes.nix @@ -0,0 +1,36 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, libDir ? "${stateDir}/lib" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir spoolDir libDir forceDisableUserChange processManager; + }; +in +rec { + mongodb = rec { + port = 27017; + + pkg = constructors.simpleMongodb { + inherit port; + }; + }; + + mongodb-secondary = rec { + port = 27018; + + pkg = constructors.simpleMongodb { + inherit port; + instanceSuffix = "-secondary"; + }; + }; +} diff --git a/tests/mysql/default.nix b/tests/mysql/default.nix new file mode 100644 index 0000000..fae9b8c --- /dev/null +++ b/tests/mysql/default.nix @@ -0,0 +1,23 @@ +{ pkgs, testService, processManagers, profiles }: + +testService { + exprFile = ./processes.nix; + systemPackages = [ pkgs.mysql ]; + + readiness = {instanceName, instance, ...}: + '' + machine.wait_for_open_port(${toString instance.port}) + ''; + + tests = {instanceName, instance, runtimeDir, forceDisableUserChange, ...}: + # Make a special exception for the first instance running in privileged mode. It should be connectible with the default settings + if instanceName == "mysql" && !forceDisableUserChange then '' + machine.succeed("echo 'show databases;' | mysql >&2") + '' else '' + machine.succeed( + "echo 'show databases;' | mysql -S ${runtimeDir}/mysqld${instance.instanceSuffix}/mysqld.sock >&2" + ) + ''; + + inherit processManagers profiles; +} diff --git a/tests/mysql/processes.nix b/tests/mysql/processes.nix new file mode 100644 index 0000000..4ef7a66 --- /dev/null +++ b/tests/mysql/processes.nix @@ -0,0 +1,37 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, libDir ? "${stateDir}/lib" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir spoolDir libDir forceDisableUserChange processManager; + }; +in +rec { + mysql = rec { + port = 3306; + instanceSuffix = ""; + + pkg = constructors.mysql { + inherit port instanceSuffix; + }; + }; + + mysql-secondary = rec { + port = 3307; + instanceSuffix = "-secondary"; + + pkg = constructors.mysql { + inherit port instanceSuffix; + }; + }; +} diff --git a/tests/postgresql/default.nix b/tests/postgresql/default.nix new file mode 100644 index 0000000..c8dbf07 --- /dev/null +++ b/tests/postgresql/default.nix @@ -0,0 +1,29 @@ +{ pkgs, testService, processManagers, profiles }: + +testService { + exprFile = ./processes.nix; + systemPackages = [ pkgs.postgresql ]; + nixosConfig = { + virtualisation.diskSize = 8192; + virtualisation.memorySize = 1024; + }; + + readiness = {instanceName, instance, ...}: + '' + machine.wait_for_open_port(${toString instance.port}) + ''; + + tests = {instanceName, instance, runtimeDir, forceDisableUserChange, ...}: + # Make a special exception for the first instance running in privileged mode. It should be connectible with the default settings + if instanceName == "postgresql" && !forceDisableUserChange then '' + machine.succeed("su - postgresql -c 'psql -l'") + '' else '' + # fmt: off + machine.succeed( + "su - ${if forceDisableUserChange then "unprivileged" else instanceName} -c 'psql ${pkgs.lib.optionalString forceDisableUserChange "-U unprivileged"} -h ${runtimeDir}/${instanceName} --port ${toString instance.port} -l'" + ) + # fmt: on + ''; + + inherit processManagers profiles; +} diff --git a/tests/postgresql/processes.nix b/tests/postgresql/processes.nix new file mode 100644 index 0000000..0a503d9 --- /dev/null +++ b/tests/postgresql/processes.nix @@ -0,0 +1,36 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, libDir ? "${stateDir}/lib" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir spoolDir libDir forceDisableUserChange processManager; + }; +in +rec { + postgresql = rec { + port = 5432; + + pkg = constructors.simplePostgresql { + inherit port; + }; + }; + + postgresql-secondary = rec { + port = 5433; + + pkg = constructors.simplePostgresql { + inherit port; + instanceSuffix = "-secondary"; + }; + }; +} diff --git a/tests/svnserve/default.nix b/tests/svnserve/default.nix new file mode 100644 index 0000000..e18f132 --- /dev/null +++ b/tests/svnserve/default.nix @@ -0,0 +1,39 @@ +{ pkgs, testService, processManagers, profiles }: + +testService { + exprFile = ./processes.nix; + systemPackages = [ pkgs.subversion ]; + + readiness = {instanceName, instance, ...}: + '' + machine.wait_for_open_port(${toString instance.port}) + ''; + + tests = {instanceName, instance, stateDir, forceDisableUserChange, ...}: + '' + # fmt: off + machine.succeed( + "mkdir -p ${instance.svnBaseDir}" + ) + machine.succeed( + "svnadmin create ${instance.svnBaseDir}/testrepo-${instanceName}" + ) + # fmt: on + '' + # Make a special exception for the first instance running in privileged mode. It should be connectible with the default settings + + (if instanceName == "svnserve" && !forceDisableUserChange then '' + # fmt: off + machine.succeed( + "svn co svn://localhost/testrepo-${instanceName}" + ) + # fmt: on + '' else '' + # fmt: off + machine.succeed( + "svn co svn://localhost:${toString instance.port}/testrepo-${instanceName}" + ) + # fmt: on + ''); + + inherit processManagers profiles; +} diff --git a/tests/svnserve/processes.nix b/tests/svnserve/processes.nix new file mode 100644 index 0000000..22dee2e --- /dev/null +++ b/tests/svnserve/processes.nix @@ -0,0 +1,40 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, libDir ? "${stateDir}/lib" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir libDir spoolDir forceDisableUserChange processManager; + }; +in +rec { + svnserve = rec { + port = 3690; + svnBaseDir = "${stateDir}/repos"; + + pkg = constructors.svnserve { + inherit port svnBaseDir; + svnGroup = "root"; + }; + }; + + svnserve-secondary = rec { + port = 3691; + svnBaseDir = "${stateDir}/repos-secondary"; + + pkg = constructors.svnserve { + inherit port svnBaseDir; + instanceSuffix = "-secondary"; + svnGroup = "root"; + }; + }; +}