[PATCH] Add memcached package, service and system test

  • Done
  • quality assurance status badge
Details
3 participants
  • Ludovic Courtès
  • Christopher Baines
  • Marius Bakke
Owner
unassigned
Submitted by
Christopher Baines
Severity
normal

Debbugs page

Christopher Baines wrote 8 years ago
(address . guix-patches@gnu.org)
20170727174531.43424168@cbaines.net
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.
-----BEGIN PGP SIGNATURE-----

iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAll6GKtfFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF
ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE
9Xdaow//fLCl4jBz1MJ9zvsJS3xqs77ceEOEHhy8tMY13mwY4yFUO946OXA8EB7G
l4fyCN9JAXKWZQndJD1v9qcaQxgMCcmGsCFBj+OorjFU3fS+pCcoA0ghgJR7j2so
S+2a1B34hEANjf3UiYndt2SN7go58HpCOF0MSB+DZf1QQbtphWrgAD3CLOB0Ro15
gXpXAqqvxN4ieT0wFQRSj1NvKuvaT7n0v2+T2CD0WvIL9eUD7bknvRo4GcYC7VWN
ZhjXZKdjrMM6gi2xgU9Jq5F06JB3B64kCwOEbIdgWafp7Uv3N6p+RgqY13i0zJdv
l10QXhiQht8r6UhM86o2yYhQgWuQLBKp2VZmMMwQ5a/4KIDSu/AA+Zuj649HW4Ei
TwfQGbrpJXJo/S9idAwxQNTdvDsS/C+Ng4agzXPGHDKiA8XRUvLuVFfLupQF9fgL
FglpmxTvMCQsydAZUHjp/QX8XudeiATDaoCl9O18YUikI1EXApK97ANagIDDspIw
jylpHLyCdWFvYdT84l+IHkLFnxYJFAcjGrJ2iUe8tA8hm2MWKdo6TecoXNjuCko9
BuYVxXct1Vy7kK8ifnE2N7YKPKFpv2AadL0GvIwEzx7ZTXH2UT9r6YU/7GsPDg9w
Ovk9h/rOBEm8t+LnogQs0sSAfW77gyzlb2G6de9zXMqtUdIPCFU=
=1rtU
-----END PGP SIGNATURE-----


Christopher Baines wrote 8 years ago
[PATCH 1/2] gnu: Add memcached.
(address . 27853@debbugs.gnu.org)
20170727164905.16662-1-mail@cbaines.net
* 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

Toggle diff (67 lines)
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
Christopher Baines wrote 8 years ago
[PATCH 2/2] services: Add memcached.
(address . 27853@debbugs.gnu.org)
20170727164905.16662-2-mail@cbaines.net
* 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

Toggle diff (306 lines)
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
Ludovic Courtès wrote 8 years ago
Re: [bug#27853] [PATCH 1/2] gnu: Add memcached.
(name . Christopher Baines)(address . mail@cbaines.net)(address . 27853@debbugs.gnu.org)
87tw1wl56l.fsf@gnu.org
Christopher Baines <mail@cbaines.net> skribis:

Toggle quote (3 lines)
> * 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’.
Ludovic Courtès wrote 8 years ago
Re: [bug#27853] [PATCH 2/2] services: Add memcached.
(name . Christopher Baines)(address . mail@cbaines.net)(address . 27853@debbugs.gnu.org)
87lgn8l4yb.fsf@gnu.org
Christopher Baines <mail@cbaines.net> skribis:

Toggle quote (6 lines)
> * 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.

[...]

Toggle quote (5 lines)
> +@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.

Toggle quote (8 lines)
> +(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?

Toggle quote (10 lines)
> + (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.

Toggle quote (6 lines)
> +(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’.
Marius Bakke wrote 8 years ago
Re: [bug#27853] [PATCH 1/2] gnu: Add memcached.
(address . 27853@debbugs.gnu.org)
87wp6rzd64.fsf@fastmail.com
Ludovic Courtès <ludo@gnu.org> writes:

Toggle quote (7 lines)
> 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'.
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAll8c5MACgkQoqBt8qM6
VPojzAf/ZAsQOUEbvblbI6/EBPgy5dMwy2V1hE6C5qbSC445PhGvdopKE99mkQMQ
twrLdZ2hgNoCFv2VNPKileJ9+xTu3Q7qZk1+4V7nCGHgUuKkwwlI0kUHVcMOz866
VoSNASFD1V8uTRm5H375cL6y+NWkxAX7lDHPTwjCLz70nb54M68x//3bDPNDQV65
EVRddcKxGFyQTfBPdNyc3PUzDfLWmJPe+kzky6cEPfK+JVBEem82yObJSs3XulOf
lYSObd6PzQbpdn/RfudswotwzwsJjYCUFxAilbxntRqAvj6dZX8rf0FkTevpxRJX
ewaLb3/1cOfRu9Yuh73zIjaaPeIU1Q==
=P4Hr
-----END PGP SIGNATURE-----

Christopher Baines wrote 8 years ago
(name . Marius Bakke)(address . mbakke@fastmail.com)
20170729172436.11704ced@cbaines.net
On Sat, 29 Jul 2017 13:37:55 +0200
Marius Bakke <mbakke@fastmail.com> wrote:

Toggle quote (13 lines)
> 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.
-----BEGIN PGP SIGNATURE-----

iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAll8tsRfFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF
ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE
9Xdbtg/+MmaswCxuCagOapS2gIhCkJ1l7aCo4ff1RFII4n+X7zvAj4sV1wWhIEJU
hAh0twGCSYXW07+8bljhzt66QIl6+qinvH8uQFZ5SJaQsEyNaAANicmBMZrEgYGQ
6ZyyUBZkuKqDREG/xlixHlTIVw+MvAvs5E3z2NZUiMxq3n5+x5soNvSgcdlgkt3j
GW34QhpTXtAo2mTUvwEu14ASLrxAbPwwKbD+XCW0vAibhX4zhZ00ocm8ciSedGDg
xphHPbaJwG7BR9M4Um8jN3cR/KiXOIoSwUM/Tz7dc5441MvIdUmwHwCUcAXsOGBO
5xRtOR92m3U5O/Z4kVkQ41QQc0ec1OmDNWam900LfxGBjC/KGCWox6bjVfiK4gTR
kSnrVgr+zralPlMqmjq3GJycq3OxSe74pGiGHtnkrLsCF7gCcdW+YlQRSTy92UcU
LI0+ZRmykJMt33QlyIbk5Jeym/ZwdjW9Gz/EwD6iOn2ncIBwr7liAojcJmzSs5c0
/hSdAFVoseQXa92ZjZDY5H+av02/f6LkRTUBYOkjutxp32sYIfgKDgWufvdkoOR3
dhxTGQtzLFFeR3jZibgNQQlwLq/ET0nDkiRAB9tQjg+gt3G2QJVoc+Qb7PBVmoD5
vOPpuMarjIih4GN746X/plrF03FsY32/+GEpFKt6mlrnM4aHVew=
=l2dA
-----END PGP SIGNATURE-----


Christopher Baines wrote 8 years ago
Re: [bug#27853] [PATCH 2/2] services: Add memcached.
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 27853@debbugs.gnu.org)
20170729173536.5c3f9b33@cbaines.net
On Fri, 28 Jul 2017 21:46:52 +0200
ludo@gnu.org (Ludovic Courtès) wrote:

Toggle quote (20 lines)
> 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.

Toggle quote (10 lines)
> > +(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.

Toggle quote (15 lines)
> > + (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.

Toggle quote (3 lines)
> 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.

Toggle quote (10 lines)
> > +(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.
-----BEGIN PGP SIGNATURE-----

iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAll8uVhfFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF
ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE
9XfzNA/7BR9Wt1fkwZnzW1ULfA5nrJTO5Yyi5fq3UtI7YRNArnsGOtgm4xX8AT09
BUnsD9yo7z8A1mGh5Bqh33JJ558xQh3mRe5xR8+iZboCVy/Fx7cLCs/MIKlIRXlb
pzvqXRpzzfWx2+cj16pEX+Fh2DOVlVvVMhKoiMsRZEy6m1lblBNfecIGORs55n8g
96bIJ4yetkzlFdbcWNRkU0TPbKI54bdrgKKp+oYJx5H7aAVudqdl2gN7qAtornhh
qhxmEUaKupfP8IL42y/eK6a4fTDUxohUwXLedCW0aCkhmEYkGzr6WgJ72vq674Hm
e97m8cEbX9B7SO5ot3o6yG1ZT55/TmUmMEeFKua8ra4Xw5lWEIR123PUxuZc9Tr5
DS01vxYQKTWE6gdy6JoPwTw4Dw8EAo81x3aUfzKlO3TGhvaQwBlZsdrtidLNDErJ
K5/zl6k7lykyhGS4UfmKWJAThFpbD+hch5VOoxOQf1RkZXI4ybpn3ToR/Ord0/UL
GE8mkSdEdK75U4mp8MxxT1UKBVrrrAp6kuraWQKgG84j729LIx5oROQoHw01yQKi
TH9TqZqCX3X44k2agdv0gkvqCC3yl9H6/hICP19PLeTs7pH/N1Ac0D7X2FV7lb/s
PuHVZMEVtxb+5ntrPFjI+Xhlip9Mwwbzx48LqlrRL816uZFHxoM=
=3pNV
-----END PGP SIGNATURE-----


Christopher Baines wrote 8 years ago
[PATCH 1/2] gnu: Add memcached.
(address . 27853@debbugs.gnu.org)
20170729163623.13531-1-mail@cbaines.net
* gnu/packages/databases.scm (memcached): New variable.
---
gnu/packages/databases.scm | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)

Toggle diff (43 lines)
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
Christopher Baines wrote 8 years ago
[PATCH 2/2] services: Add memcached.
(address . 27853@debbugs.gnu.org)
20170729163623.13531-2-mail@cbaines.net
* 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

Toggle diff (281 lines)
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}."
;;;
+;;; 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))))
+
+
+;;;
;;; 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
Ludovic Courtès wrote 8 years ago
Re: [bug#27853] [PATCH 1/2] gnu: Add memcached.
(name . Christopher Baines)(address . mail@cbaines.net)(address . 27853@debbugs.gnu.org)
87zibngfik.fsf@gnu.org
Christopher Baines <mail@cbaines.net> skribis:

Toggle quote (2 lines)
> * gnu/packages/databases.scm (memcached): New variable.

Perfect!
Ludovic Courtès wrote 8 years ago
Re: [bug#27853] [PATCH 2/2] services: Add memcached.
(name . Christopher Baines)(address . mail@cbaines.net)(address . 27853@debbugs.gnu.org)
87vambgfg4.fsf@gnu.org
Christopher Baines <mail@cbaines.net> skribis:

Toggle quote (8 lines)
> * 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.

[...]

Toggle quote (4 lines)
> +@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. :-)

Toggle quote (2 lines)
> +@item @code{interfaces} (default: @code{'("0.0.0.0")})

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

LGTM, thanks!

LUdo’.
Christopher Baines wrote 8 years ago
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 27853-done@debbugs.gnu.org)
20170730091346.34fa067d@cbaines.net
On Sat, 29 Jul 2017 22:23:39 +0200
ludo@gnu.org (Ludovic Courtès) wrote:

Toggle quote (29 lines)
> 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 :)
-----BEGIN PGP SIGNATURE-----

iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAll9lTpfFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF
ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE
9XdFZxAAtX8dk+S86G1y6g691R+SgIdT27srSDOTcnzc3hzTr3DcyoVeGf/LL9Wk
unpFiA9au/c6uVkkfNMlJU9mJJiK6Q90I7RlIYoN8/R6ic3jN0LtVPLmMr29JvfQ
khZe4l/+CxKKowemtXnXhyP4G3OHmHszRx2TCz34Zt4+LA3D5Xww1GhurNEZSURU
aJCzszRXul68Us5kjGZ9sTGZEr38P67xIpz+OONVCLRjyPFKoB8ik0Yl44D1bmeq
0hE+ccik5F+ezdIlt/28V1sNZK5D7Yg+xJIVBN7ewJig+7yaoFDokssO+bv3KDDw
NyMlms0fGTKdf2rlfN3pOpfS0dRdObghAm5AjRI8g8DQS1zQRVUtFxRgNwmKlnz+
4Gwl+e33E8g9cmasQ8lAX5lVTUKovXGAHSJY3cTgPgJOZZcc6tPP3g/jK1+uSwly
rSUWJfIy9iMbfOGdHsBJXSi5Y/CRs76GjEAjYHmqnUTejnH9zDdsnxqgBc/307z0
WoLNeTedWiPE8W6hp/CB3JWZCgNxYqmjFZxhRz3leCodVePxwkxxZZQT3RV9fc0x
ylKX2MFO5puhvJFc1H0hYrscgtrO1WRN62f026jikrdLkV/RC6jYeBV6WHH3CE5o
qwgWXzkEB9tba0yrLTs8SfnF2ZoKyI75MaqhcDtk1biEMXyrLxk=
=NbY/
-----END PGP SIGNATURE-----


Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 27853@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 27853
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch
You may also tag this issue. See list of standard tags. For example, to set the confirmed and easy tags
mumi command -t +confirmed -t +easy
Or, remove the moreinfo tag and set the help tag
mumi command -t -moreinfo -t +help