diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix index fd75db1abe7..b53b9c47b01 100644 --- a/nixos/modules/misc/ids.nix +++ b/nixos/modules/misc/ids.nix @@ -226,6 +226,7 @@ gitit = 202; riemanntools = 203; subsonic = 204; + riak = 205; # When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399! @@ -430,6 +431,7 @@ gitit = 202; riemanntools = 203; subsonic = 204; + riak = 205; # When adding a gid, make sure it doesn't match an existing # uid. Users and groups with the same name should have equal diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index f771bced5ef..7e2c42f2b8c 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -131,6 +131,7 @@ ./services/databases/opentsdb.nix ./services/databases/postgresql.nix ./services/databases/redis.nix + ./services/databases/riak.nix ./services/databases/virtuoso.nix ./services/desktops/accountsservice.nix ./services/desktops/geoclue2.nix diff --git a/nixos/modules/services/databases/riak.nix b/nixos/modules/services/databases/riak.nix new file mode 100644 index 00000000000..bee768fa42a --- /dev/null +++ b/nixos/modules/services/databases/riak.nix @@ -0,0 +1,148 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.services.riak; + +in + +{ + + ###### interface + + options = { + + services.riak = { + + enable = mkEnableOption "riak"; + + package = mkOption { + type = types.package; + example = literalExample "pkgs.riak2"; + description = '' + Riak package to use. + ''; + }; + + nodeName = mkOption { + type = types.string; + default = "riak@127.0.0.1"; + description = '' + Name of the Erlang node. + ''; + }; + + distributedCookie = mkOption { + type = types.string; + default = "riak"; + description = '' + Cookie for distributed node communication. All nodes in the + same cluster should use the same cookie or they will not be able to + communicate. + ''; + }; + + dataDir = mkOption { + type = types.path; + default = "/var/db/riak"; + description = '' + Data directory for Riak. + ''; + }; + + logDir = mkOption { + type = types.path; + default = "/var/log/riak"; + description = '' + Log directory for Riak. + ''; + }; + + extraConfig = mkOption { + type = types.lines; + default = ""; + description = '' + Additional text to be appended to riak.conf. + ''; + }; + + }; + + }; + + ###### implementation + + config = mkIf cfg.enable { + + environment.systemPackages = [ cfg.package ]; + environment.etc."riak/riak.conf".text = '' + nodename = ${cfg.nodeName} + distributed_cookie = ${cfg.distributedCookie} + + platform_log_dir = ${cfg.logDir} + platform_etc_dir = /etc/riak + platform_data_dir = ${cfg.dataDir} + + ${cfg.extraConfig} + ''; + + users.extraUsers.riak = { + name = "riak"; + uid = config.ids.uids.riak; + group = "riak"; + description = "Riak server user"; + }; + + users.extraGroups.riak.gid = config.ids.gids.riak; + + systemd.services.riak = { + description = "Riak Server"; + + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + path = [ + pkgs.utillinux # for `logger` + pkgs.bash + ]; + + environment.RIAK_DATA_DIR = "${cfg.dataDir}"; + environment.RIAK_LOG_DIR = "${cfg.logDir}"; + environment.RIAK_ETC_DIR = "/etc/riak"; + + preStart = '' + if ! test -e ${cfg.logDir}; then + mkdir -m 0755 -p ${cfg.logDir} + chown -R riak ${cfg.logDir} + fi + + if ! test -e ${cfg.dataDir}; then + mkdir -m 0700 -p ${cfg.dataDir} + chown -R riak ${cfg.dataDir} + fi + ''; + + serviceConfig = { + ExecStart = "${cfg.package}/bin/riak console"; + ExecStop = "${cfg.package}/bin/riak stop"; + StandardInput = "tty"; + User = "riak"; + Group = "riak"; + PermissionsStartOnly = true; + # Give Riak a decent amount of time to clean up. + TimeoutStopSec = 120; + LimitNOFILE = 65536; + }; + + unitConfig.RequiresMountsFor = [ + "${cfg.dataDir}" + "${cfg.logDir}" + "/etc/riak" + ]; + }; + + }; + +} diff --git a/nixos/tests/riak.nix b/nixos/tests/riak.nix new file mode 100644 index 00000000000..a56f51c4e50 --- /dev/null +++ b/nixos/tests/riak.nix @@ -0,0 +1,21 @@ +import ./make-test.nix { + name = "riak"; + + nodes = { + master = + { pkgs, config, ... }: + + { + services.riak.enable = true; + services.riak.package = pkgs.riak2; + }; + }; + + testScript = '' + startAll; + + $master->waitForUnit("riak"); + $master->sleep(20); # Hopefully this is long enough!! + $master->succeed("RIAK_DATA_DIR='/var/db/riak' RIAK_LOG_DIR='/var/log/riak' RIAK_ETC_DIR='/etc/riak' riak ping 2>&1"); + ''; +} diff --git a/pkgs/servers/nosql/riak/2.1.1.nix b/pkgs/servers/nosql/riak/2.1.1.nix new file mode 100644 index 00000000000..ce160312dbb --- /dev/null +++ b/pkgs/servers/nosql/riak/2.1.1.nix @@ -0,0 +1,94 @@ +{ stdenv, lib, fetchurl, unzip, erlangR16, which, pam, coreutils }: + +let + solrName = "solr-4.7.0-yz-1.tgz"; + yokozunaJarName = "yokozuna-2.jar"; + yzMonitorJarName = "yz_monitor-1.jar"; + + srcs = { + riak = fetchurl { + url = "http://s3.amazonaws.com/downloads.basho.com/riak/2.1/2.1.1/riak-2.1.1.tar.gz"; + sha256 = "1bm5j3zknz82mkyh5zgaap73awflh4mkibdvdz164235mdxlwhdm"; + }; + solr = fetchurl { + url = "http://s3.amazonaws.com/files.basho.com/solr/${solrName}"; + sha256 = "0brml3lb3xk26rmi05rrzpxrw92alfi9gi7p7537ny9lqg3808qp"; + }; + yokozunaJar = fetchurl { + url = "http://s3.amazonaws.com/files.basho.com/yokozuna/${yokozunaJarName}"; + sha256 = "0xzfy181qxv27pc4f5xd0szn8vls5743273awr5rwv3608gkspj2"; + }; + yzMonitorJar = fetchurl { + url = "http://s3.amazonaws.com/files.basho.com/yokozuna/${yzMonitorJarName}"; + sha256 = "0kb97d1a43vw759j1h5qwbhx455pidn2pi7sfxijqic37h81ri1m"; + }; + }; +in + +stdenv.mkDerivation rec { + name = "riak-2.1.1"; + + buildInputs = [ + which unzip erlangR16 pam + ]; + + src = srcs.riak; + + postPatch = '' + sed -i deps/node_package/priv/base/env.sh \ + -e 's@{{platform_data_dir}}@$RIAK_DATA_DIR@' \ + -e 's@^RUNNER_SCRIPT_DIR=.*@RUNNER_SCRIPT_DIR='$out'/bin@' \ + -e 's@^RUNNER_BASE_DIR=.*@RUNNER_BASE_DIR='$out'@' \ + -e 's@^RUNNER_ETC_DIR=.*@RUNNER_ETC_DIR=$RIAK_ETC_DIR@' \ + -e 's@^RUNNER_LOG_DIR=.*@RUNNER_LOG_DIR=$RIAK_LOG_DIR@' + ''; + + preBuild = '' + mkdir solr-pkg + cp ${srcs.solr} solr-pkg/${solrName} + export SOLR_PKG_DIR=$(readlink -f solr-pkg) + + mkdir -p deps/yokozuna/priv/java_lib + cp ${srcs.yokozunaJar} deps/yokozuna/priv/java_lib/${yokozunaJarName} + + mkdir -p deps/yokozuna/priv/solr/lib/ext + cp ${srcs.yzMonitorJar} deps/yokozuna/priv/solr/lib/ext/${yzMonitorJarName} + + patchShebangs . + ''; + + buildPhase = '' + runHook preBuild + + make locked-deps + make rel + + runHook postBuild + ''; + + doCheck = false; + + installPhase = '' + runHook preInstall + + mkdir $out + mv rel/riak/etc rel/riak/riak-etc + mkdir -p rel/riak/etc + mv rel/riak/riak-etc rel/riak/etc/riak + mv rel/riak/* $out + + for prog in $out/bin/*; do + substituteInPlace $prog \ + --replace '. "`cd \`dirname $0\` && /bin/pwd`/../lib/env.sh"' \ + ". $out/lib/env.sh" + done + + runHook postInstall + ''; + + meta = with lib; { + maintainers = with maintainers; [ cstrahan ]; + description = "Dynamo inspired NoSQL DB by Basho"; + platforms = platforms.linux; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index b962567781f..6d4bd57fa67 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9012,6 +9012,7 @@ let }; riak = callPackage ../servers/nosql/riak/1.3.1.nix { }; + riak2 = callPackage ../servers/nosql/riak/2.1.1.nix { }; influxdb = callPackage ../servers/nosql/influxdb { };