store: 'GUIX_DAEMON_SOCKET' can now be a URI.
* guix/store.scm (%daemon-socket-file): Rename to... (%daemon-socket-uri): ... this. (connect-to-daemon): New procedure. (open-connection): Rename 'file' to 'uri'. Use 'connect-to-daemon' instead of 'open-unix-domain-socket'. * guix/tests.scm (open-connection-for-tests): Rename 'file' to 'uri'. * tests/guix-build.sh: Add tests. * tests/store.scm ("open-connection with file:// URI"): New tests.master
parent
031e6087c4
commit
1397b422e2
|
@ -3666,10 +3666,30 @@ accidental modifications.
|
||||||
@end quotation
|
@end quotation
|
||||||
|
|
||||||
The @code{(guix store)} module provides procedures to connect to the
|
The @code{(guix store)} module provides procedures to connect to the
|
||||||
daemon, and to perform RPCs. These are described below.
|
daemon, and to perform RPCs. These are described below. By default,
|
||||||
|
@code{open-connection}, and thus all the @command{guix} commands,
|
||||||
|
connect to the local daemon or to the URI specified by the
|
||||||
|
@code{GUIX_DAEMON_SOCKET} environment variable.
|
||||||
|
|
||||||
@deffn {Scheme Procedure} open-connection [@var{file}] [#:reserve-space? #t]
|
@defvr {Environment Variable} GUIX_DAEMON_SOCKET
|
||||||
Connect to the daemon over the Unix-domain socket at @var{file}. When
|
When set, the value of this variable should be a file name or a URI
|
||||||
|
designating the daemon endpoint. When it is a file name, it denotes a
|
||||||
|
Unix-domain socket to connect to. In addition to file names, the
|
||||||
|
supported URI schemes are:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item file
|
||||||
|
@itemx unix
|
||||||
|
These are for Unix-domain sockets.
|
||||||
|
@code{file:///var/guix/daemon-socket/socket} is equivalent to
|
||||||
|
@file{/var/guix/daemon-socket/socket}.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
Additional URI schemes may be supported in the future.
|
||||||
|
@end defvr
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} open-connection [@var{uri}] [#:reserve-space? #t]
|
||||||
|
Connect to the daemon over the Unix-domain socket at @var{uri} (a string). When
|
||||||
@var{reserve-space?} is true, instruct it to reserve a little bit of
|
@var{reserve-space?} is true, instruct it to reserve a little bit of
|
||||||
extra space on the file system so that the garbage collector can still
|
extra space on the file system so that the garbage collector can still
|
||||||
operate should the disk become full. Return a server object.
|
operate should the disk become full. Return a server object.
|
||||||
|
|
|
@ -39,7 +39,8 @@
|
||||||
#:use-module (ice-9 regex)
|
#:use-module (ice-9 regex)
|
||||||
#:use-module (ice-9 vlist)
|
#:use-module (ice-9 vlist)
|
||||||
#:use-module (ice-9 popen)
|
#:use-module (ice-9 popen)
|
||||||
#:export (%daemon-socket-file
|
#:use-module (web uri)
|
||||||
|
#:export (%daemon-socket-uri
|
||||||
%gc-roots-directory
|
%gc-roots-directory
|
||||||
%default-substitute-urls
|
%default-substitute-urls
|
||||||
|
|
||||||
|
@ -216,8 +217,8 @@
|
||||||
(define %default-socket-path
|
(define %default-socket-path
|
||||||
(string-append %state-directory "/daemon-socket/socket"))
|
(string-append %state-directory "/daemon-socket/socket"))
|
||||||
|
|
||||||
(define %daemon-socket-file
|
(define %daemon-socket-uri
|
||||||
;; File name of the socket the daemon listens too.
|
;; URI or file name of the socket the daemon listens too.
|
||||||
(make-parameter (or (getenv "GUIX_DAEMON_SOCKET")
|
(make-parameter (or (getenv "GUIX_DAEMON_SOCKET")
|
||||||
%default-socket-path)))
|
%default-socket-path)))
|
||||||
|
|
||||||
|
@ -369,10 +370,29 @@
|
||||||
(file file)
|
(file file)
|
||||||
(errno errno)))))))))
|
(errno errno)))))))))
|
||||||
|
|
||||||
(define* (open-connection #:optional (file (%daemon-socket-file))
|
(define (connect-to-daemon uri)
|
||||||
|
"Connect to the daemon at URI, a string that may be an actual URI or a file
|
||||||
|
name."
|
||||||
|
(define connect
|
||||||
|
(match (string->uri uri)
|
||||||
|
(#f ;URI is a file name
|
||||||
|
open-unix-domain-socket)
|
||||||
|
((? uri? uri)
|
||||||
|
(match (uri-scheme uri)
|
||||||
|
((or #f 'file 'unix)
|
||||||
|
(lambda (_)
|
||||||
|
(open-unix-domain-socket (uri-path uri))))
|
||||||
|
(x
|
||||||
|
(raise (condition (&nix-connection-error
|
||||||
|
(file (uri->string uri))
|
||||||
|
(errno ENOTSUP)))))))))
|
||||||
|
|
||||||
|
(connect uri))
|
||||||
|
|
||||||
|
(define* (open-connection #:optional (uri (%daemon-socket-uri))
|
||||||
#:key port (reserve-space? #t) cpu-affinity)
|
#:key port (reserve-space? #t) cpu-affinity)
|
||||||
"Connect to the daemon over the Unix-domain socket at FILE, or, if PORT is
|
"Connect to the daemon at URI (a string), or, if PORT is not #f, use it as
|
||||||
not #f, use it as the I/O port over which to communicate to a build daemon.
|
the I/O port over which to communicate to a build daemon.
|
||||||
|
|
||||||
When RESERVE-SPACE? is true, instruct it to reserve a little bit of extra
|
When RESERVE-SPACE? is true, instruct it to reserve a little bit of extra
|
||||||
space on the file system so that the garbage collector can still operate,
|
space on the file system so that the garbage collector can still operate,
|
||||||
|
@ -383,10 +403,10 @@ for this connection will be pinned. Return a server object."
|
||||||
;; One of the 'write-' or 'read-' calls below failed, but this is
|
;; One of the 'write-' or 'read-' calls below failed, but this is
|
||||||
;; really a connection error.
|
;; really a connection error.
|
||||||
(raise (condition
|
(raise (condition
|
||||||
(&nix-connection-error (file (or port file))
|
(&nix-connection-error (file (or port uri))
|
||||||
(errno EPROTO))
|
(errno EPROTO))
|
||||||
(&message (message "build daemon handshake failed"))))))
|
(&message (message "build daemon handshake failed"))))))
|
||||||
(let ((port (or port (open-unix-domain-socket file))))
|
(let ((port (or port (connect-to-daemon uri))))
|
||||||
(write-int %worker-magic-1 port)
|
(write-int %worker-magic-1 port)
|
||||||
(let ((r (read-int port)))
|
(let ((r (read-int port)))
|
||||||
(and (eqv? r %worker-magic-2)
|
(and (eqv? r %worker-magic-2)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -56,13 +56,13 @@
|
||||||
(or (and=> (getenv "GUIX_BINARY_SUBSTITUTE_URL") list)
|
(or (and=> (getenv "GUIX_BINARY_SUBSTITUTE_URL") list)
|
||||||
'())))
|
'())))
|
||||||
|
|
||||||
(define* (open-connection-for-tests #:optional (file (%daemon-socket-file)))
|
(define* (open-connection-for-tests #:optional (uri (%daemon-socket-uri)))
|
||||||
"Open a connection to the build daemon for tests purposes and return it."
|
"Open a connection to the build daemon for tests purposes and return it."
|
||||||
(guard (c ((nix-error? c)
|
(guard (c ((nix-error? c)
|
||||||
(format (current-error-port)
|
(format (current-error-port)
|
||||||
"warning: build daemon error: ~s~%" c)
|
"warning: build daemon error: ~s~%" c)
|
||||||
#f))
|
#f))
|
||||||
(let ((store (open-connection file)))
|
(let ((store (open-connection uri)))
|
||||||
;; Make sure we build everything by ourselves.
|
;; Make sure we build everything by ourselves.
|
||||||
(set-build-options store
|
(set-build-options store
|
||||||
#:use-substitutes? #f
|
#:use-substitutes? #f
|
||||||
|
|
|
@ -36,6 +36,14 @@ guix build -e '(@@ (gnu packages bootstrap) %bootstrap-guile)' | \
|
||||||
guix build hello -d | \
|
guix build hello -d | \
|
||||||
grep -e '-hello-[0-9\.]\+\.drv$'
|
grep -e '-hello-[0-9\.]\+\.drv$'
|
||||||
|
|
||||||
|
# Passing a URI.
|
||||||
|
GUIX_DAEMON_SOCKET="file://$NIX_STATE_DIR/daemon-socket/socket" \
|
||||||
|
guix build -e '(@@ (gnu packages bootstrap) %bootstrap-guile)'
|
||||||
|
|
||||||
|
( if GUIX_DAEMON_SOCKET="weird://uri" \
|
||||||
|
guix build -e '(@@ (gnu packages bootstrap) %bootstrap-guile)'; \
|
||||||
|
then exit 1; fi )
|
||||||
|
|
||||||
# Check --sources option with its arguments
|
# Check --sources option with its arguments
|
||||||
module_dir="t-guix-build-$$"
|
module_dir="t-guix-build-$$"
|
||||||
mkdir "$module_dir"
|
mkdir "$module_dir"
|
||||||
|
|
|
@ -48,6 +48,14 @@
|
||||||
|
|
||||||
(test-begin "store")
|
(test-begin "store")
|
||||||
|
|
||||||
|
(test-assert "open-connection with file:// URI"
|
||||||
|
(let ((store (open-connection (string-append "file://"
|
||||||
|
(%daemon-socket-uri)))))
|
||||||
|
(and (add-text-to-store store "foo" "bar")
|
||||||
|
(begin
|
||||||
|
(close-connection store)
|
||||||
|
#t))))
|
||||||
|
|
||||||
(test-equal "connection handshake error"
|
(test-equal "connection handshake error"
|
||||||
EPROTO
|
EPROTO
|
||||||
(let ((port (%make-void-port "rw")))
|
(let ((port (%make-void-port "rw")))
|
||||||
|
|
Reference in New Issue