[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#27853] [PATCH 2/2] services: Add memcached.
From: |
Christopher Baines |
Subject: |
[bug#27853] [PATCH 2/2] services: Add memcached. |
Date: |
Thu, 27 Jul 2017 17:49:05 +0100 |
* gnu/services/memcached.scm: New file.
* gnu/tests/memcached.scm: New file.
* doc/guix.texi (Cache Services): New node.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add entry for services/memcached.scm and
tests/memcached.scm.
---
doc/guix.texi | 37 ++++++++++++++
gnu/local.mk | 2 +
gnu/services/memcached.scm | 96 +++++++++++++++++++++++++++++++++++
gnu/tests/memcached.scm | 121 +++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 256 insertions(+)
create mode 100644 gnu/services/memcached.scm
create mode 100644 gnu/tests/memcached.scm
diff --git a/doc/guix.texi b/doc/guix.texi
index e8c4e0eaf..5055232df 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -9009,6 +9009,7 @@ declaration.
* Printing Services:: Local and remote printer support.
* Desktop Services:: D-Bus and desktop services.
* Database Services:: SQL databases.
+* Cache Services:: Temporary data stores.
* Mail Services:: IMAP, POP3, SMTP, and all that.
* Messaging Services:: Messaging services.
* Kerberos Services:: Kerberos services.
@@ -11746,6 +11747,42 @@ Directory in which to store the database and related
files.
@end table
@end deftp
address@hidden Cache Services
address@hidden Cache Services
+
address@hidden cache
+
address@hidden {Scheme Variable} memcached-service-type
+This is the service type for the @uref{https://memcached.org/, Memcached}
+service, which provides a distributed in memory cache. The value for the
service type is a @code{memcached-configuration} object.
address@hidden defvr
+
address@hidden
+(service memcached-service-type)
address@hidden example
+
address@hidden {Data Type} memcached-configuration
+Data type representing the configuration of memcached.
+
address@hidden @asis
address@hidden @code{memcached} (default: @code{memcached})
+The Memcached package to use.
+
address@hidden @code{interfaces} (default: @code{'("0.0.0.0")})
+Network interfaces on which to listen.
+
address@hidden @code{tcp-port} (default: @code{11211})
+Port on which to accept connections on,
+
address@hidden @code{udp-port} (default: @code{11211})
+Port on which to accept UDP connections on, a value of 0 will disable
+listening on a UDP socket.
+
address@hidden @code{additional-options} (default: @code{'()})
+Additional command line options to pass to @code{memcached}.
address@hidden table
address@hidden deftp
+
@node Mail Services
@subsubsection Mail Services
diff --git a/gnu/local.mk b/gnu/local.mk
index 3241cfd3b..199e0a8c3 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -440,6 +440,7 @@ GNU_SYSTEM_MODULES = \
%D%/services/lirc.scm \
%D%/services/mail.scm \
%D%/services/mcron.scm \
+ %D%/services/memcached.scm \
%D%/services/messaging.scm \
%D%/services/networking.scm \
%D%/services/nfs.scm \
@@ -485,6 +486,7 @@ GNU_SYSTEM_MODULES = \
%D%/tests/nfs.scm \
%D%/tests/install.scm \
%D%/tests/mail.scm \
+ %D%/tests/memcached.scm \
%D%/tests/messaging.scm \
%D%/tests/networking.scm \
%D%/tests/ssh.scm \
diff --git a/gnu/services/memcached.scm b/gnu/services/memcached.scm
new file mode 100644
index 000000000..411fda0d5
--- /dev/null
+++ b/gnu/services/memcached.scm
@@ -0,0 +1,96 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Christopher Baines <address@hidden>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services memcached)
+ #:use-module (gnu packages admin)
+ #:use-module (gnu packages memcached)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu services)
+ #:use-module (gnu system shadow)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:use-module (guix modules)
+ #:use-module (ice-9 match)
+ #:export (memcached-service-type
+
+ <memcached-configuration>
+ memcached-configuration
+ memcached-configuration?
+ memcached-configuration-memecached
+ memcached-configuration-interfaces
+ memcached-configuration-tcp-port
+ memcached-configuration-udp-port
+ memcached-configuration-additional-options))
+
+;;;
+;;; Memcached
+;;;
+
+(define-record-type* <memcached-configuration>
+ memcached-configuration make-memcached-configuration
+ memcached-configuration?
+ (memcached memcached-configuration-memcached ;<package>
+ (default memcached))
+ (interfaces memcached-configuration-interfaces
+ (default '("0.0.0.0")))
+ (tcp-port memcached-configuration-tcp-port
+ (default 11211))
+ (udp-port memcached-configuration-udp-port
+ (default 11211))
+ (additional-options memcached-configuration-additional-options
+ (default '())))
+
+(define %memcached-accounts
+ (list (user-group (name "memcached") (system? #t))
+ (user-account
+ (name "memcached")
+ (group "memcached")
+ (system? #t)
+ (comment "Memcached server user")
+ (home-directory "/var/empty")
+ (shell (file-append shadow "/sbin/nologin")))))
+
+(define memcached-shepherd-service
+ (match-lambda
+ (($ <memcached-configuration> memcached interfaces tcp-port udp-port
+ additional-options)
+ (with-imported-modules (source-module-closure
+ '((gnu build shepherd)))
+ (list (shepherd-service
+ (provision '(memcached))
+ (documentation "Run the Memcached daemon.")
+ (requirement '(user-processes loopback))
+ (modules '((gnu build shepherd)))
+ (start #~(make-forkexec-constructor
+ `(#$(file-append memcached "/bin/memcached")
+ "-l" #$(string-join interfaces ",")
+ "-p" #$(number->string tcp-port)
+ "-U" #$(number->string udp-port)
+ "-u" "memcached"
+ ,address@hidden)
+ #:log-file "/var/log/memcached"))
+ (stop #~(make-kill-destructor))))))))
+
+(define memcached-service-type
+ (service-type (name 'memcached)
+ (extensions
+ (list (service-extension shepherd-root-service-type
+ memcached-shepherd-service)
+ (service-extension account-service-type
+ (const %memcached-accounts))))
+ (default-value (memcached-configuration))))
diff --git a/gnu/tests/memcached.scm b/gnu/tests/memcached.scm
new file mode 100644
index 000000000..02dc3550e
--- /dev/null
+++ b/gnu/tests/memcached.scm
@@ -0,0 +1,121 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Christopher Baines <address@hidden>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu tests memcached)
+ #:use-module (gnu tests)
+ #:use-module (gnu system)
+ #:use-module (gnu system file-systems)
+ #:use-module (gnu system shadow)
+ #:use-module (gnu system vm)
+ #:use-module (gnu services)
+ #:use-module (gnu services memcached)
+ #:use-module (gnu services networking)
+ #:use-module (guix gexp)
+ #:use-module (guix store)
+ #:export (%test-memcached))
+
+(define %memcached-os
+ (simple-operating-system
+ (dhcp-client-service)
+ (service memcached-service-type)))
+
+(define* (run-memcached-test #:optional (port 11211))
+ "Run tests in %MEMCACHED-OS, forwarding PORT."
+ (define os
+ (marionette-operating-system
+ %memcached-os
+ #:imported-modules '((gnu services herd)
+ (guix combinators))))
+
+ (define vm
+ (virtual-machine
+ (operating-system os)
+ (port-forwardings `((11211 . ,port)))))
+
+ (define test
+ (with-imported-modules '((gnu build marionette))
+ #~(begin
+ (use-modules (srfi srfi-11) (srfi srfi-64)
+ (gnu build marionette)
+ (ice-9 rdelim))
+
+ (define marionette
+ (make-marionette (list #$vm)))
+
+ (mkdir #$output)
+ (chdir #$output)
+
+ (test-begin "memcached")
+
+ ;; Wait for memcached to be up and running.
+ (test-eq "service running"
+ 'running!
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd))
+ (start-service 'memcached)
+ 'running!)
+ marionette))
+
+ (let* ((ai (car (getaddrinfo "localhost"
+ #$(number->string port))))
+ (s (socket (addrinfo:fam ai)
+ (addrinfo:socktype ai)
+ (addrinfo:protocol ai)))
+ (key "testkey")
+ (value "guix"))
+ (connect s (addrinfo:addr ai))
+
+ (test-equal "set"
+ "STORED\r"
+ (begin
+ (simple-format s "set ~A 0 60 ~A\r\n~A\r\n"
+ key
+ (string-length value)
+ value)
+ (read-line s)))
+
+ (test-equal "get"
+ (simple-format #f "VALUE ~A 0 ~A\r~A\r"
+ key
+ (string-length value)
+ value)
+ (begin
+ (simple-format s "get ~A\r\n" key)
+ (string-append
+ (read-line s)
+ (read-line s))))
+
+ (close-port s))
+
+ ;; There should be a log file in here.
+ (test-assert "log file"
+ (marionette-eval
+ '(file-exists? "/var/log/memcached")
+ marionette))
+
+ (test-end)
+ (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+ (gexp->derivation "memcached-test" test))
+
+(define %test-memcached
+ (system-test
+ (name "memcached")
+ (description "Connect to a running MEMCACHED server.")
+ (value (run-memcached-test))))
--
2.13.3
[bug#27853] [PATCH 1/2] gnu: Add memcached., Christopher Baines, 2017/07/29
[bug#27853] [PATCH 1/2] gnu: Add memcached., Ludovic Courtès, 2017/07/29