guix-patches
[Top][All Lists]
Advanced

[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






reply via email to

[Prev in Thread] Current Thread [Next in Thread]