daemon: Implement ‘substitute-urls’ RPC.
* nix/libstore/worker-protocol.hh (PROTOCOL_VERSION): Bump. (WorkerOp): Add ‘wopSubstituteURLs’. * nix/nix-daemon/nix-daemon.cc (performOp): Implement it. * guix/store.scm (%protocol-version): Bump. (operation-id): Add ‘substitute-urls’. (substitute-urls): New procedure. * tests/store.scm ("substitute-urls, default") ("substitute-urls, client-specified URLs") ("substitute-urls, disabled"): New tests. Change-Id: I2c0119500c3a1eecfa5ebf32463ffb0f173161de
parent
b650dcabf1
commit
1e47148f46
|
@ -1,5 +1,5 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2012-2022 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2018 Jan Nieuwenhuizen <janneke@gnu.org>
|
||||
;;; Copyright © 2019, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||
;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
|
||||
|
@ -145,6 +145,7 @@
|
|||
path-info-nar-size
|
||||
|
||||
built-in-builders
|
||||
substitute-urls
|
||||
references
|
||||
references/cached
|
||||
references*
|
||||
|
@ -199,7 +200,7 @@
|
|||
derivation-log-file
|
||||
log-file))
|
||||
|
||||
(define %protocol-version #x163)
|
||||
(define %protocol-version #x164)
|
||||
|
||||
(define %worker-magic-1 #x6e697863) ; "nixc"
|
||||
(define %worker-magic-2 #x6478696f) ; "dxio"
|
||||
|
@ -253,7 +254,8 @@
|
|||
(query-valid-derivers 33)
|
||||
(optimize-store 34)
|
||||
(verify-store 35)
|
||||
(built-in-builders 80))
|
||||
(built-in-builders 80)
|
||||
(substitute-urls 81))
|
||||
|
||||
(define-enumerate-type hash-algo
|
||||
;; hash.hh
|
||||
|
@ -1780,6 +1782,16 @@ The result is always the empty list unless the daemon was started with
|
|||
This makes sense only when the daemon was started with '--cache-failures'."
|
||||
boolean)
|
||||
|
||||
(define substitute-urls
|
||||
(let ((urls (operation (substitute-urls)
|
||||
#f
|
||||
string-list)))
|
||||
(lambda (store)
|
||||
"Return the list of currently configured substitutes URLs for STORE, or
|
||||
#f if the daemon is too old and does not implement this RPC."
|
||||
(and (>= (store-connection-version store) #x164)
|
||||
(urls store)))))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Per-connection caches.
|
||||
|
|
|
@ -6,7 +6,7 @@ namespace nix {
|
|||
#define WORKER_MAGIC_1 0x6e697863
|
||||
#define WORKER_MAGIC_2 0x6478696f
|
||||
|
||||
#define PROTOCOL_VERSION 0x163
|
||||
#define PROTOCOL_VERSION 0x164
|
||||
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
|
||||
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
|
||||
|
||||
|
@ -44,7 +44,8 @@ typedef enum {
|
|||
wopQueryValidDerivers = 33,
|
||||
wopOptimiseStore = 34,
|
||||
wopVerifyStore = 35,
|
||||
wopBuiltinBuilders = 80
|
||||
wopBuiltinBuilders = 80,
|
||||
wopSubstituteURLs = 81
|
||||
} WorkerOp;
|
||||
|
||||
|
||||
|
|
|
@ -736,6 +736,23 @@ static void performOp(bool trusted, unsigned int clientVersion,
|
|||
break;
|
||||
}
|
||||
|
||||
case wopSubstituteURLs: {
|
||||
startWork();
|
||||
Strings urls;
|
||||
if (settings.get("build-use-substitutes", std::string("false")) == "true") {
|
||||
/* First check the client-provided substitute URLs, then those
|
||||
passed to the daemon. */
|
||||
auto str = settings.get("untrusted-substitute-urls", std::string(""));
|
||||
if (str.empty()) {
|
||||
str = settings.get("substitute-urls", std::string(""));
|
||||
}
|
||||
urls = tokenizeString<Strings>(str);
|
||||
}
|
||||
stopWork();
|
||||
writeStrings(urls, to);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
throw Error(format("invalid operation %1%") % op);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2012-2021, 2023 Ludovic Courtès <ludo@gnu.org>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
|
@ -105,7 +105,28 @@
|
|||
"/283gqy39v3g9dxjy26rynl0zls82fmcg-guile-2.0.7/bin/guile")))
|
||||
(not (direct-store-path? (%store-prefix)))))
|
||||
|
||||
(test-skip (if %store 0 15))
|
||||
(test-skip (if %store 0 18))
|
||||
|
||||
(test-equal "substitute-urls, default"
|
||||
(list (getenv "GUIX_BINARY_SUBSTITUTE_URL"))
|
||||
(with-store store
|
||||
(set-build-options store #:use-substitutes? #t)
|
||||
(substitute-urls store)))
|
||||
|
||||
(test-equal "substitute-urls, client-specified URLs"
|
||||
'("http://substitutes.example.org"
|
||||
"http://other.example.org")
|
||||
(with-store store
|
||||
(set-build-options store #:use-substitutes? #t
|
||||
#:substitute-urls '("http://substitutes.example.org"
|
||||
"http://other.example.org"))
|
||||
(substitute-urls store)))
|
||||
|
||||
(test-equal "substitute-urls, disabled"
|
||||
'()
|
||||
(with-store store
|
||||
(set-build-options store #:use-substitutes? #f)
|
||||
(substitute-urls store)))
|
||||
|
||||
(test-equal "profiles/per-user exists and is not writable"
|
||||
#o755
|
||||
|
|
Reference in New Issue