unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#27853] [PATCH] Add memcached package, service and system test
@ 2017-07-27 16:45 Christopher Baines
  2017-07-27 16:49 ` [bug#27853] [PATCH 1/2] gnu: Add memcached Christopher Baines
  2017-07-29 16:36 ` Christopher Baines
  0 siblings, 2 replies; 13+ messages in thread
From: Christopher Baines @ 2017-07-27 16:45 UTC (permalink / raw)
  To: 27853

[-- Attachment #1: Type: text/plain, Size: 145 bytes --]

Memcached is a in memory key value store.  It has a small
and generic API, and was originally intended for use with dynamic web
applications.

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 963 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 1/2] gnu: Add memcached.
  2017-07-27 16:45 [bug#27853] [PATCH] Add memcached package, service and system test Christopher Baines
@ 2017-07-27 16:49 ` Christopher Baines
  2017-07-27 16:49   ` [bug#27853] [PATCH 2/2] services: " Christopher Baines
  2017-07-28 19:41   ` [bug#27853] [PATCH 1/2] gnu: " Ludovic Courtès
  2017-07-29 16:36 ` Christopher Baines
  1 sibling, 2 replies; 13+ messages in thread
From: Christopher Baines @ 2017-07-27 16:49 UTC (permalink / raw)
  To: 27853

* gnu/packages/memcached.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add memcached.scm entry.
---
 gnu/local.mk               |  1 +
 gnu/packages/memcached.scm | 47 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)
 create mode 100644 gnu/packages/memcached.scm

diff --git a/gnu/local.mk b/gnu/local.mk
index 9dfca9dbb..3241cfd3b 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -268,6 +268,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/mcrypt.scm			\
   %D%/packages/medical.scm			\
   %D%/packages/mes.scm				\
+  %D%/packages/memcached.scm			\
   %D%/packages/messaging.scm			\
   %D%/packages/mingw.scm			\
   %D%/packages/mg.scm				\
diff --git a/gnu/packages/memcached.scm b/gnu/packages/memcached.scm
new file mode 100644
index 000000000..70583be7e
--- /dev/null
+++ b/gnu/packages/memcached.scm
@@ -0,0 +1,47 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
+;;;
+;;; 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 packages memcached)
+  #:use-module (guix packages)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix download)
+  #:use-module (gnu packages libevent)
+  #:use-module (gnu packages cyrus-sasl)
+  #:use-module ((guix licenses) #:prefix license:))
+
+(define-public memcached
+  (package
+    (name "memcached")
+    (version "1.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://memcached.org/files/memcached-" version ".tar.gz"))
+       (sha256
+        (base32 "0chwc0g7wfvcad36z8pf2jbgygdnm9nm1l6pwjsn3d2b089gh0f0"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("libevent" ,libevent)
+       ("cyrus-sasl" ,cyrus-sasl)))
+    (home-page "https://memcached.org/")
+    (synopsis "In memory caching service")
+    (description "Memcached is a in memory key value store.  It has a small
+and generic API, and was originally intended for use with dynamic web
+applications.")
+    (license license:bsd-3)))
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 2/2] services: Add memcached.
  2017-07-27 16:49 ` [bug#27853] [PATCH 1/2] gnu: Add memcached Christopher Baines
@ 2017-07-27 16:49   ` Christopher Baines
  2017-07-28 19:46     ` Ludovic Courtès
  2017-07-28 19:41   ` [bug#27853] [PATCH 1/2] gnu: " Ludovic Courtès
  1 sibling, 1 reply; 13+ messages in thread
From: Christopher Baines @ 2017-07-27 16:49 UTC (permalink / raw)
  To: 27853

* 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
 
+@node Cache Services
+@subsubsection Cache Services
+
+@cindex cache
+
+@defvr {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.
+@end defvr
+
+@example
+(service memcached-service-type)
+@end example
+
+@deftp {Data Type} memcached-configuration
+Data type representing the configuration of memcached.
+
+@table @asis
+@item @code{memcached} (default: @code{memcached})
+The Memcached package to use.
+
+@item @code{interfaces} (default: @code{'("0.0.0.0")})
+Network interfaces on which to listen.
+
+@item @code{tcp-port} (default: @code{11211})
+Port on which to accept connections on,
+
+@item @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.
+
+@item @code{additional-options} (default: @code{'()})
+Additional command line options to pass to @code{memcached}.
+@end table
+@end 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 <mail@cbaines.net>
+;;;
+;;; 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"
+                          ,#$@additional-options)
+                        #: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 <mail@cbaines.net>
+;;;
+;;; 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

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 1/2] gnu: Add memcached.
  2017-07-27 16:49 ` [bug#27853] [PATCH 1/2] gnu: Add memcached Christopher Baines
  2017-07-27 16:49   ` [bug#27853] [PATCH 2/2] services: " Christopher Baines
@ 2017-07-28 19:41   ` Ludovic Courtès
  2017-07-29 11:37     ` Marius Bakke
  1 sibling, 1 reply; 13+ messages in thread
From: Ludovic Courtès @ 2017-07-28 19:41 UTC (permalink / raw)
  To: Christopher Baines; +Cc: 27853

Christopher Baines <mail@cbaines.net> skribis:

> * gnu/packages/memcached.scm: New file.
> * gnu/local.mk (GNU_SYSTEM_MODULES): Add memcached.scm entry.

Perhaps it could go to web.scm, but no strong opinion.

Otherwise LGTM, thanks!

Ludo’.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 2/2] services: Add memcached.
  2017-07-27 16:49   ` [bug#27853] [PATCH 2/2] services: " Christopher Baines
@ 2017-07-28 19:46     ` Ludovic Courtès
  2017-07-29 16:35       ` Christopher Baines
  0 siblings, 1 reply; 13+ messages in thread
From: Ludovic Courtès @ 2017-07-28 19:46 UTC (permalink / raw)
  To: Christopher Baines; +Cc: 27853

Christopher Baines <mail@cbaines.net> skribis:

> * 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.

[...]

> +@node Cache Services
> +@subsubsection Cache Services
> +
> +@cindex cache

Please write a couple of introductory sentences here.  :-)

I was going to suggest to document it under “Web”, but I guess this is
not inherently web-specific, so it’s probably better this way.

> +(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")))

Should it default to 127.0.0.1 to avoid bad surprises?

> +              (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"
> +                          ,#$@additional-options)
> +                        #:log-file "/var/log/memcached"))
> +              (stop #~(make-kill-destructor))))))))

If memcached has an option to create a PID file, it’s better to use it
and pass #:pid-file here (makes sure memcached is really listening when
the service is started.)

Perhaps a good candidate for ‘make-forkexec-constructor/container’?  We
can check that afterwards though.

> +(define %test-memcached
> +  (system-test
> +   (name "memcached")
> +   (description "Connect to a running MEMCACHED server.")
> +   (value (run-memcached-test))))

Awesome.

OK with these changes, thank you!

Ludo’.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 1/2] gnu: Add memcached.
  2017-07-28 19:41   ` [bug#27853] [PATCH 1/2] gnu: " Ludovic Courtès
@ 2017-07-29 11:37     ` Marius Bakke
  2017-07-29 16:24       ` Christopher Baines
  0 siblings, 1 reply; 13+ messages in thread
From: Marius Bakke @ 2017-07-29 11:37 UTC (permalink / raw)
  To: Ludovic Courtès, Christopher Baines; +Cc: 27853

[-- Attachment #1: Type: text/plain, Size: 407 bytes --]

Ludovic Courtès <ludo@gnu.org> writes:

> Christopher Baines <mail@cbaines.net> skribis:
>
>> * gnu/packages/memcached.scm: New file.
>> * gnu/local.mk (GNU_SYSTEM_MODULES): Add memcached.scm entry.
>
> Perhaps it could go to web.scm, but no strong opinion.

How about 'databases.scm'? Key/value stores are databases too :)

'redis' already resides there and does a similar job to 'memcached'.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 1/2] gnu: Add memcached.
  2017-07-29 11:37     ` Marius Bakke
@ 2017-07-29 16:24       ` Christopher Baines
  0 siblings, 0 replies; 13+ messages in thread
From: Christopher Baines @ 2017-07-29 16:24 UTC (permalink / raw)
  To: Marius Bakke; +Cc: 27853

[-- Attachment #1: Type: text/plain, Size: 710 bytes --]

On Sat, 29 Jul 2017 13:37:55 +0200
Marius Bakke <mbakke@fastmail.com> wrote:

> Ludovic Courtès <ludo@gnu.org> writes:
> 
> > Christopher Baines <mail@cbaines.net> skribis:
> >  
> >> * gnu/packages/memcached.scm: New file.
> >> * gnu/local.mk (GNU_SYSTEM_MODULES): Add memcached.scm entry.  
> >
> > Perhaps it could go to web.scm, but no strong opinion.  
> 
> How about 'databases.scm'? Key/value stores are databases too :)
> 
> 'redis' already resides there and does a similar job to 'memcached'.

Hmm, yeah, I think databases.scm is good, I'll move it there. While
memcached is sometimes used with web services, it's not a web service
itself, so I think databases is better than web.

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 963 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 2/2] services: Add memcached.
  2017-07-28 19:46     ` Ludovic Courtès
@ 2017-07-29 16:35       ` Christopher Baines
  0 siblings, 0 replies; 13+ messages in thread
From: Christopher Baines @ 2017-07-29 16:35 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 27853

[-- Attachment #1: Type: text/plain, Size: 2766 bytes --]

On Fri, 28 Jul 2017 21:46:52 +0200
ludo@gnu.org (Ludovic Courtès) wrote:

> Christopher Baines <mail@cbaines.net> skribis:
> 
> > * 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.  
> 
> [...]
> 
> > +@node Cache Services
> > +@subsubsection Cache Services
> > +
> > +@cindex cache  
> 
> Please write a couple of introductory sentences here.  :-)
> 
> I was going to suggest to document it under “Web”, but I guess this is
> not inherently web-specific, so it’s probably better this way.

I've moved things to the databases place everywhere, as I think that is
ok.

> > +(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")))  
> 
> Should it default to 127.0.0.1 to avoid bad surprises?

It could be, I set the default to the upstream default as a first step.
I'd be fine with only listening locally by default if we make a
specific decision to do that.

> > +              (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"
> > +                          ,#$@additional-options)
> > +                        #:log-file "/var/log/memcached"))
> > +              (stop #~(make-kill-destructor))))))))  
> 
> If memcached has an option to create a PID file, it’s better to use it
> and pass #:pid-file here (makes sure memcached is really listening
> when the service is started.)

Yep, I forgot about that. It does support PID files, so I'll use that.

> Perhaps a good candidate for ‘make-forkexec-constructor/container’?
> We can check that afterwards though.

Tried it, but the service fails to start with no log output. I'll leave
this for now, but might try and do some more debugging at some point.

> > +(define %test-memcached
> > +  (system-test
> > +   (name "memcached")
> > +   (description "Connect to a running MEMCACHED server.")
> > +   (value (run-memcached-test))))  
> 
> Awesome.
> 
> OK with these changes, thank you!

I'll send updated patches.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 963 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 1/2] gnu: Add memcached.
  2017-07-27 16:45 [bug#27853] [PATCH] Add memcached package, service and system test Christopher Baines
  2017-07-27 16:49 ` [bug#27853] [PATCH 1/2] gnu: Add memcached Christopher Baines
@ 2017-07-29 16:36 ` Christopher Baines
  2017-07-29 16:36   ` [bug#27853] [PATCH 2/2] services: " Christopher Baines
  2017-07-29 20:22   ` [bug#27853] [PATCH 1/2] gnu: " Ludovic Courtès
  1 sibling, 2 replies; 13+ messages in thread
From: Christopher Baines @ 2017-07-29 16:36 UTC (permalink / raw)
  To: 27853

* gnu/packages/databases.scm (memcached): New variable.
---
 gnu/packages/databases.scm | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index 8f5857ad7..13efc5edc 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -53,6 +53,7 @@
   #:use-module (gnu packages gnupg)
   #:use-module (gnu packages jemalloc)
   #:use-module (gnu packages language)
+  #:use-module (gnu packages libevent)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages man)
   #:use-module (gnu packages ncurses)
@@ -290,6 +291,28 @@ SQL, Key/Value, XML/XQuery or Java Object storage for their data model.")
 mapping from string keys to string values.")
     (license license:bsd-3)))
 
+(define-public memcached
+  (package
+    (name "memcached")
+    (version "1.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://memcached.org/files/memcached-" version ".tar.gz"))
+       (sha256
+        (base32 "0chwc0g7wfvcad36z8pf2jbgygdnm9nm1l6pwjsn3d2b089gh0f0"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("libevent" ,libevent)
+       ("cyrus-sasl" ,cyrus-sasl)))
+    (home-page "https://memcached.org/")
+    (synopsis "In memory caching service")
+    (description "Memcached is a in memory key value store.  It has a small
+and generic API, and was originally intended for use with dynamic web
+applications.")
+    (license license:bsd-3)))
+
 (define-public mysql
   (package
     (name "mysql")
-- 
2.13.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 2/2] services: Add memcached.
  2017-07-29 16:36 ` Christopher Baines
@ 2017-07-29 16:36   ` Christopher Baines
  2017-07-29 20:23     ` Ludovic Courtès
  2017-07-29 20:22   ` [bug#27853] [PATCH 1/2] gnu: " Ludovic Courtès
  1 sibling, 1 reply; 13+ messages in thread
From: Christopher Baines @ 2017-07-29 16:36 UTC (permalink / raw)
  To: 27853

* gnu/services/databases.scm (memcached-service-type, %memcached-accounts):
  New variables.
  (<memcached-configuration>): New record type.
  (memcached-service-type): New procedures.
* gnu/tests/databases.scm: New file.
* doc/guix.texi (Database Services): Document the new memcached service.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add entry for tests/memcached.scm.
---
 doc/guix.texi              |  31 ++++++++++++
 gnu/local.mk               |   1 +
 gnu/services/databases.scm |  73 +++++++++++++++++++++++++++
 gnu/tests/databases.scm    | 121 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 226 insertions(+)
 create mode 100644 gnu/tests/databases.scm

diff --git a/doc/guix.texi b/doc/guix.texi
index 345285031..b59b6ea00 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -11724,6 +11724,37 @@ TCP port on which the database server listens for incoming connections.
 @end table
 @end deftp
 
+@defvr {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.
+@end defvr
+
+@example
+(service memcached-service-type)
+@end example
+
+@deftp {Data Type} memcached-configuration
+Data type representing the configuration of memcached.
+
+@table @asis
+@item @code{memcached} (default: @code{memcached})
+The Memcached package to use.
+
+@item @code{interfaces} (default: @code{'("0.0.0.0")})
+Network interfaces on which to listen.
+
+@item @code{tcp-port} (default: @code{11211})
+Port on which to accept connections on,
+
+@item @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.
+
+@item @code{additional-options} (default: @code{'()})
+Additional command line options to pass to @code{memcached}.
+@end table
+@end deftp
+
 @defvr {Scheme Variable} redis-service-type
 This is the service type for the @uref{https://redis.io/, Redis}
 key/value store, whose value is a @code{redis-configuration} object.
diff --git a/gnu/local.mk b/gnu/local.mk
index 29dee73c4..6c515f8d2 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -480,6 +480,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/tests.scm					\
   %D%/tests/admin.scm				\
   %D%/tests/base.scm				\
+  %D%/tests/databases.scm			\
   %D%/tests/dict.scm				\
   %D%/tests/nfs.scm				\
   %D%/tests/install.scm				\
diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm
index 3ecc8aff7..3b64d0e07 100644
--- a/gnu/services/databases.scm
+++ b/gnu/services/databases.scm
@@ -25,6 +25,7 @@
   #:use-module (gnu system shadow)
   #:use-module (gnu packages admin)
   #:use-module (gnu packages databases)
+  #:use-module (guix modules)
   #:use-module (guix records)
   #:use-module (guix gexp)
   #:use-module (ice-9 match)
@@ -33,6 +34,16 @@
             postgresql-service
             postgresql-service-type
 
+            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
+
             mysql-service
             mysql-service-type
             mysql-configuration
@@ -178,6 +189,68 @@ and stores the database cluster in @var{data-directory}."
 
 \f
 ;;;
+;;; 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)
+                          "--daemon"
+                          "-P" "/var/run/memcached.pid"
+                          "-u" "memcached"
+                          ,#$@additional-options)
+                        #:log-file "/var/log/memcached"
+                        #:pid-file "/var/run/memcached.pid"))
+              (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))))
+
+\f
+;;;
 ;;; MySQL.
 ;;;
 
diff --git a/gnu/tests/databases.scm b/gnu/tests/databases.scm
new file mode 100644
index 000000000..310210c36
--- /dev/null
+++ b/gnu/tests/databases.scm
@@ -0,0 +1,121 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
+;;;
+;;; 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 databases)
+  #: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 databases)
+  #: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.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 1/2] gnu: Add memcached.
  2017-07-29 16:36 ` Christopher Baines
  2017-07-29 16:36   ` [bug#27853] [PATCH 2/2] services: " Christopher Baines
@ 2017-07-29 20:22   ` Ludovic Courtès
  1 sibling, 0 replies; 13+ messages in thread
From: Ludovic Courtès @ 2017-07-29 20:22 UTC (permalink / raw)
  To: Christopher Baines; +Cc: 27853

Christopher Baines <mail@cbaines.net> skribis:

> * gnu/packages/databases.scm (memcached): New variable.

Perfect!

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#27853] [PATCH 2/2] services: Add memcached.
  2017-07-29 16:36   ` [bug#27853] [PATCH 2/2] services: " Christopher Baines
@ 2017-07-29 20:23     ` Ludovic Courtès
  2017-07-30  8:13       ` bug#27853: " Christopher Baines
  0 siblings, 1 reply; 13+ messages in thread
From: Ludovic Courtès @ 2017-07-29 20:23 UTC (permalink / raw)
  To: Christopher Baines; +Cc: 27853

Christopher Baines <mail@cbaines.net> skribis:

> * gnu/services/databases.scm (memcached-service-type, %memcached-accounts):
>   New variables.
>   (<memcached-configuration>): New record type.
>   (memcached-service-type): New procedures.
> * gnu/tests/databases.scm: New file.
> * doc/guix.texi (Database Services): Document the new memcached service.
> * gnu/local.mk (GNU_SYSTEM_MODULES): Add entry for tests/memcached.scm.

[...]

> +@defvr {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.

Please wrap lines to 80 chars and leave two spaces after an
end-of-sentence period.  :-)

> +@item @code{interfaces} (default: @code{'("0.0.0.0")})

If that’s what upstream does, fine with me.

LGTM, thanks!

LUdo’.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#27853: [PATCH 2/2] services: Add memcached.
  2017-07-29 20:23     ` Ludovic Courtès
@ 2017-07-30  8:13       ` Christopher Baines
  0 siblings, 0 replies; 13+ messages in thread
From: Christopher Baines @ 2017-07-30  8:13 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 27853-done

[-- Attachment #1: Type: text/plain, Size: 1204 bytes --]

On Sat, 29 Jul 2017 22:23:39 +0200
ludo@gnu.org (Ludovic Courtès) wrote:

> Christopher Baines <mail@cbaines.net> skribis:
> 
> > * gnu/services/databases.scm (memcached-service-type,
> > %memcached-accounts): New variables.
> >   (<memcached-configuration>): New record type.
> >   (memcached-service-type): New procedures.
> > * gnu/tests/databases.scm: New file.
> > * doc/guix.texi (Database Services): Document the new memcached
> > service.
> > * gnu/local.mk (GNU_SYSTEM_MODULES): Add entry for
> > tests/memcached.scm.  
> 
> [...]
> 
> > +@defvr {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.  
> 
> Please wrap lines to 80 chars and leave two spaces after an
> end-of-sentence period.  :-)
> 
> > +@item @code{interfaces} (default: @code{'("0.0.0.0")})  
> 
> If that’s what upstream does, fine with me.
> 
> LGTM, thanks!

I've fixed the formatting in the docs, fixed one mistake in the commit
message and pushed. Thanks for your review :)

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 963 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-07-30  8:14 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-27 16:45 [bug#27853] [PATCH] Add memcached package, service and system test Christopher Baines
2017-07-27 16:49 ` [bug#27853] [PATCH 1/2] gnu: Add memcached Christopher Baines
2017-07-27 16:49   ` [bug#27853] [PATCH 2/2] services: " Christopher Baines
2017-07-28 19:46     ` Ludovic Courtès
2017-07-29 16:35       ` Christopher Baines
2017-07-28 19:41   ` [bug#27853] [PATCH 1/2] gnu: " Ludovic Courtès
2017-07-29 11:37     ` Marius Bakke
2017-07-29 16:24       ` Christopher Baines
2017-07-29 16:36 ` Christopher Baines
2017-07-29 16:36   ` [bug#27853] [PATCH 2/2] services: " Christopher Baines
2017-07-29 20:23     ` Ludovic Courtès
2017-07-30  8:13       ` bug#27853: " Christopher Baines
2017-07-29 20:22   ` [bug#27853] [PATCH 1/2] gnu: " Ludovic Courtès

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).