mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 05:18:07 -05:00
gnu: ganeti: Update to 3.0.1.
* gnu/packages/virtualization.scm (ganeti): Update to 3.0.1. [source](patches): Remove obsolete. * gnu/tests/ganeti.scm (%ganeti-os): Adjust network configuration so QEMU port forwarding can work. (run-ganeti-test): Remove unused port mapping. Adjust and enable previously failing test. * gnu/packages/patches/ganeti-deterministic-manual.patch, gnu/packages/patches/ganeti-drbd-compat.patch, gnu/packages/patches/ganeti-os-disk-size.patch: Delete files. * gnu/local.mk (dist_patch_DATA): Adjust accordingly.
This commit is contained in:
parent
fafa127d80
commit
93f69b02a2
6 changed files with 19 additions and 225 deletions
|
@ -1063,11 +1063,8 @@ dist_patch_DATA = \
|
||||||
%D%/packages/patches/fuse-overlapping-headers.patch \
|
%D%/packages/patches/fuse-overlapping-headers.patch \
|
||||||
%D%/packages/patches/fxdiv-system-libraries.patch \
|
%D%/packages/patches/fxdiv-system-libraries.patch \
|
||||||
%D%/packages/patches/gajim-honour-GAJIM_PLUGIN_PATH.patch \
|
%D%/packages/patches/gajim-honour-GAJIM_PLUGIN_PATH.patch \
|
||||||
%D%/packages/patches/ganeti-deterministic-manual.patch \
|
|
||||||
%D%/packages/patches/ganeti-disable-version-symlinks.patch \
|
%D%/packages/patches/ganeti-disable-version-symlinks.patch \
|
||||||
%D%/packages/patches/ganeti-drbd-compat.patch \
|
|
||||||
%D%/packages/patches/ganeti-haskell-pythondir.patch \
|
%D%/packages/patches/ganeti-haskell-pythondir.patch \
|
||||||
%D%/packages/patches/ganeti-os-disk-size.patch \
|
|
||||||
%D%/packages/patches/ganeti-preserve-PYTHONPATH.patch \
|
%D%/packages/patches/ganeti-preserve-PYTHONPATH.patch \
|
||||||
%D%/packages/patches/ganeti-shepherd-master-failover.patch \
|
%D%/packages/patches/ganeti-shepherd-master-failover.patch \
|
||||||
%D%/packages/patches/ganeti-shepherd-support.patch \
|
%D%/packages/patches/ganeti-shepherd-support.patch \
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
Sort the ecode list in the gnt-cluster manual for deterministic results.
|
|
||||||
|
|
||||||
Submitted upstream: <https://github.com/ganeti/ganeti/pull/1504>.
|
|
||||||
|
|
||||||
diff --git a/lib/build/sphinx_ext.py b/lib/build/sphinx_ext.py
|
|
||||||
--- a/lib/build/sphinx_ext.py
|
|
||||||
+++ b/lib/build/sphinx_ext.py
|
|
||||||
@@ -108,7 +108,7 @@ CV_ECODES_DOC = "ecodes"
|
|
||||||
# pylint: disable=W0621
|
|
||||||
CV_ECODES_DOC_LIST = [(name, doc) for (_, name, doc) in constants.CV_ALL_ECODES]
|
|
||||||
DOCUMENTED_CONSTANTS = {
|
|
||||||
- CV_ECODES_DOC: CV_ECODES_DOC_LIST,
|
|
||||||
+ CV_ECODES_DOC: sorted(CV_ECODES_DOC_LIST, key=lambda tup: tup[0]),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,166 +0,0 @@
|
||||||
This patch adds support for newer versions of DRBD.
|
|
||||||
|
|
||||||
Submitted upstream: <https://github.com/ganeti/ganeti/pull/1496>.
|
|
||||||
|
|
||||||
diff --git a/lib/storage/drbd.py b/lib/storage/drbd.py
|
|
||||||
--- a/lib/storage/drbd.py
|
|
||||||
+++ b/lib/storage/drbd.py
|
|
||||||
@@ -315,6 +315,13 @@ class DRBD8Dev(base.BlockDev):
|
|
||||||
"""
|
|
||||||
return self._show_info_cls.GetDevInfo(self._GetShowData(minor))
|
|
||||||
|
|
||||||
+ @staticmethod
|
|
||||||
+ def _NeedsLocalSyncerParams():
|
|
||||||
+ # For DRBD >= 8.4, syncer init must be done after local, not in net.
|
|
||||||
+ info = DRBD8.GetProcInfo()
|
|
||||||
+ version = info.GetVersion()
|
|
||||||
+ return version["k_minor"] >= 4
|
|
||||||
+
|
|
||||||
def _MatchesLocal(self, info):
|
|
||||||
"""Test if our local config matches with an existing device.
|
|
||||||
|
|
||||||
@@ -397,6 +404,20 @@ class DRBD8Dev(base.BlockDev):
|
|
||||||
base.ThrowError("drbd%d: can't attach local disk: %s",
|
|
||||||
minor, result.output)
|
|
||||||
|
|
||||||
+ def _WaitForMinorSyncParams():
|
|
||||||
+ """Call _SetMinorSyncParams and raise RetryAgain on errors.
|
|
||||||
+ """
|
|
||||||
+ if self._SetMinorSyncParams(minor, self.params):
|
|
||||||
+ raise utils.RetryAgain()
|
|
||||||
+
|
|
||||||
+ if self._NeedsLocalSyncerParams():
|
|
||||||
+ # Retry because disk config for DRBD resource may be still uninitialized.
|
|
||||||
+ try:
|
|
||||||
+ utils.Retry(_WaitForMinorSyncParams, 1.0, 5.0)
|
|
||||||
+ except utils.RetryTimeout as e:
|
|
||||||
+ base.ThrowError("drbd%d: can't set the synchronization parameters: %s" %
|
|
||||||
+ (minor, utils.CommaJoin(e.args[0])))
|
|
||||||
+
|
|
||||||
def _AssembleNet(self, minor, net_info, dual_pri=False, hmac=None,
|
|
||||||
secret=None):
|
|
||||||
"""Configure the network part of the device.
|
|
||||||
@@ -432,21 +453,24 @@ class DRBD8Dev(base.BlockDev):
|
|
||||||
# sync speed only after setting up both sides can race with DRBD
|
|
||||||
# connecting, hence we set it here before telling DRBD anything
|
|
||||||
# about its peer.
|
|
||||||
- sync_errors = self._SetMinorSyncParams(minor, self.params)
|
|
||||||
- if sync_errors:
|
|
||||||
- base.ThrowError("drbd%d: can't set the synchronization parameters: %s" %
|
|
||||||
- (minor, utils.CommaJoin(sync_errors)))
|
|
||||||
+
|
|
||||||
+ if not self._NeedsLocalSyncerParams():
|
|
||||||
+ sync_errors = self._SetMinorSyncParams(minor, self.params)
|
|
||||||
+ if sync_errors:
|
|
||||||
+ base.ThrowError("drbd%d: can't set the synchronization parameters: %s" %
|
|
||||||
+ (minor, utils.CommaJoin(sync_errors)))
|
|
||||||
|
|
||||||
family = self._GetNetFamily(minor, lhost, rhost)
|
|
||||||
|
|
||||||
- cmd = self._cmd_gen.GenNetInitCmd(minor, family, lhost, lport,
|
|
||||||
+ cmds = self._cmd_gen.GenNetInitCmds(minor, family, lhost, lport,
|
|
||||||
rhost, rport, protocol,
|
|
||||||
dual_pri, hmac, secret, self.params)
|
|
||||||
|
|
||||||
- result = utils.RunCmd(cmd)
|
|
||||||
- if result.failed:
|
|
||||||
- base.ThrowError("drbd%d: can't setup network: %s - %s",
|
|
||||||
- minor, result.fail_reason, result.output)
|
|
||||||
+ for cmd in cmds:
|
|
||||||
+ result = utils.RunCmd(cmd)
|
|
||||||
+ if result.failed:
|
|
||||||
+ base.ThrowError("drbd%d: can't setup network: %s - %s",
|
|
||||||
+ minor, result.fail_reason, result.output)
|
|
||||||
|
|
||||||
def _CheckNetworkConfig():
|
|
||||||
info = self._GetShowInfo(minor)
|
|
||||||
@@ -463,19 +487,20 @@ class DRBD8Dev(base.BlockDev):
|
|
||||||
base.ThrowError("drbd%d: timeout while configuring network", minor)
|
|
||||||
|
|
||||||
# Once the assembly is over, try to set the synchronization parameters
|
|
||||||
- try:
|
|
||||||
- # The minor may not have been set yet, requiring us to set it at least
|
|
||||||
- # temporarily
|
|
||||||
- old_minor = self.minor
|
|
||||||
- self._SetFromMinor(minor)
|
|
||||||
- sync_errors = self.SetSyncParams(self.params)
|
|
||||||
- if sync_errors:
|
|
||||||
- base.ThrowError("drbd%d: can't set the synchronization parameters: %s" %
|
|
||||||
- (self.minor, utils.CommaJoin(sync_errors)))
|
|
||||||
- finally:
|
|
||||||
- # Undo the change, regardless of whether it will have to be done again
|
|
||||||
- # soon
|
|
||||||
- self._SetFromMinor(old_minor)
|
|
||||||
+ if not self._NeedsLocalSyncerParams():
|
|
||||||
+ try:
|
|
||||||
+ # The minor may not have been set yet, requiring us to set it at least
|
|
||||||
+ # temporarily
|
|
||||||
+ old_minor = self.minor
|
|
||||||
+ self._SetFromMinor(minor)
|
|
||||||
+ sync_errors = self.SetSyncParams(self.params)
|
|
||||||
+ if sync_errors:
|
|
||||||
+ base.ThrowError("drbd%d: can't set the synchronization parameters: %s" %
|
|
||||||
+ (self.minor, utils.CommaJoin(sync_errors)))
|
|
||||||
+ finally:
|
|
||||||
+ # Undo the change, regardless of whether it will have to be done again
|
|
||||||
+ # soon
|
|
||||||
+ self._SetFromMinor(old_minor)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _GetNetFamily(minor, lhost, rhost):
|
|
||||||
diff --git a/lib/storage/drbd_cmdgen.py b/lib/storage/drbd_cmdgen.py
|
|
||||||
--- a/lib/storage/drbd_cmdgen.py
|
|
||||||
+++ b/lib/storage/drbd_cmdgen.py
|
|
||||||
@@ -56,7 +56,7 @@ class BaseDRBDCmdGenerator(object):
|
|
||||||
def GenLocalInitCmds(self, minor, data_dev, meta_dev, size_mb, params):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
- def GenNetInitCmd(self, minor, family, lhost, lport, rhost, rport, protocol,
|
|
||||||
+ def GenNetInitCmds(self, minor, family, lhost, lport, rhost, rport, protocol,
|
|
||||||
dual_pri, hmac, secret, params):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ class DRBD83CmdGenerator(BaseDRBDCmdGenerator):
|
|
||||||
|
|
||||||
return [args]
|
|
||||||
|
|
||||||
- def GenNetInitCmd(self, minor, family, lhost, lport, rhost, rport, protocol,
|
|
||||||
+ def GenNetInitCmds(self, minor, family, lhost, lport, rhost, rport, protocol,
|
|
||||||
dual_pri, hmac, secret, params):
|
|
||||||
args = ["drbdsetup", self._DevPath(minor), "net",
|
|
||||||
"%s:%s:%s" % (family, lhost, lport),
|
|
||||||
@@ -155,7 +155,7 @@ class DRBD83CmdGenerator(BaseDRBDCmdGenerator):
|
|
||||||
if params[constants.LDP_NET_CUSTOM]:
|
|
||||||
args.extend(shlex.split(params[constants.LDP_NET_CUSTOM]))
|
|
||||||
|
|
||||||
- return args
|
|
||||||
+ return [args]
|
|
||||||
|
|
||||||
def GenSyncParamsCmd(self, minor, params):
|
|
||||||
args = ["drbdsetup", self._DevPath(minor), "syncer"]
|
|
||||||
@@ -345,8 +345,14 @@ class DRBD84CmdGenerator(BaseDRBDCmdGenerator):
|
|
||||||
|
|
||||||
return cmds
|
|
||||||
|
|
||||||
- def GenNetInitCmd(self, minor, family, lhost, lport, rhost, rport, protocol,
|
|
||||||
+ def GenNetInitCmds(self, minor, family, lhost, lport, rhost, rport, protocol,
|
|
||||||
dual_pri, hmac, secret, params):
|
|
||||||
+ cmds = []
|
|
||||||
+
|
|
||||||
+ cmds.append(["drbdsetup", "new-resource", self._GetResource(minor)])
|
|
||||||
+ cmds.append(["drbdsetup", "new-minor", self._GetResource(minor),
|
|
||||||
+ str(minor), "0"])
|
|
||||||
+
|
|
||||||
args = ["drbdsetup", "connect", self._GetResource(minor),
|
|
||||||
"%s:%s:%s" % (family, lhost, lport),
|
|
||||||
"%s:%s:%s" % (family, rhost, rport),
|
|
||||||
@@ -362,7 +368,8 @@ class DRBD84CmdGenerator(BaseDRBDCmdGenerator):
|
|
||||||
if params[constants.LDP_NET_CUSTOM]:
|
|
||||||
args.extend(shlex.split(params[constants.LDP_NET_CUSTOM]))
|
|
||||||
|
|
||||||
- return args
|
|
||||||
+ cmds.append(args)
|
|
||||||
+ return cmds
|
|
||||||
|
|
||||||
def GenSyncParamsCmd(self, minor, params):
|
|
||||||
args = ["drbdsetup", "disk-options", minor]
|
|
|
@ -1,17 +0,0 @@
|
||||||
This exposes information about disk sizes to OS install scripts. instance-guix
|
|
||||||
uses this if available to determine the size of the VM image.
|
|
||||||
|
|
||||||
Submitted upstream:
|
|
||||||
https://github.com/ganeti/ganeti/pull/1503
|
|
||||||
|
|
||||||
diff --git a/lib/backend.py b/lib/backend.py
|
|
||||||
--- a/lib/backend.py
|
|
||||||
+++ b/lib/backend.py
|
|
||||||
@@ -4305,6 +4305,7 @@ def OSEnvironment(instance, inst_os, debug=0):
|
|
||||||
uri = _CalculateDeviceURI(instance, disk, real_disk)
|
|
||||||
result["DISK_%d_ACCESS" % idx] = disk.mode
|
|
||||||
result["DISK_%d_UUID" % idx] = disk.uuid
|
|
||||||
+ result["DISK_%d_SIZE" % idx] = str(disk.size)
|
|
||||||
if real_disk.dev_path:
|
|
||||||
result["DISK_%d_PATH" % idx] = real_disk.dev_path
|
|
||||||
if uri:
|
|
|
@ -14,7 +14,7 @@
|
||||||
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
|
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
|
||||||
;;; Copyright © 2020, 2021 Brice Waegeneire <brice@waegenei.re>
|
;;; Copyright © 2020, 2021 Brice Waegeneire <brice@waegenei.re>
|
||||||
;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||||
;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
|
;;; Copyright © 2020, 2021 Marius Bakke <mbakke@fastmail.com>
|
||||||
;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
|
;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
|
||||||
;;; Copyright © 2020 Brett Gilio <brettg@gnu.org>
|
;;; Copyright © 2020 Brett Gilio <brettg@gnu.org>
|
||||||
;;; Copyright © 2021 Leo Famulari <leo@famulari.name>
|
;;; Copyright © 2021 Leo Famulari <leo@famulari.name>
|
||||||
|
@ -513,20 +513,17 @@ (define-public ganeti
|
||||||
(name "ganeti")
|
(name "ganeti")
|
||||||
;; Note: we use a pre-release for Python 3 compatibility as well as many
|
;; Note: we use a pre-release for Python 3 compatibility as well as many
|
||||||
;; other fixes.
|
;; other fixes.
|
||||||
(version "3.0.0beta1-24-g024cc9fa2")
|
(version "3.0.1")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method git-fetch)
|
(method git-fetch)
|
||||||
(uri (git-reference
|
(uri (git-reference
|
||||||
(url "https://github.com/ganeti/ganeti")
|
(url "https://github.com/ganeti/ganeti")
|
||||||
(commit (string-append "v" version))))
|
(commit (string-append "v" version))))
|
||||||
(sha256
|
(sha256
|
||||||
(base32 "1ll34qd2mifni3bhg7cnir3xfnkafig8ch33qndqwrsby0y5ssia"))
|
(base32 "1i7gx0sdx9316fnldbv738s0ihym1370nhc1chk0biandkl8vvq0"))
|
||||||
(file-name (git-file-name name version))
|
(file-name (git-file-name name version))
|
||||||
(patches (search-patches "ganeti-shepherd-support.patch"
|
(patches (search-patches "ganeti-shepherd-support.patch"
|
||||||
"ganeti-shepherd-master-failover.patch"
|
"ganeti-shepherd-master-failover.patch"
|
||||||
"ganeti-deterministic-manual.patch"
|
|
||||||
"ganeti-drbd-compat.patch"
|
|
||||||
"ganeti-os-disk-size.patch"
|
|
||||||
"ganeti-haskell-pythondir.patch"
|
"ganeti-haskell-pythondir.patch"
|
||||||
"ganeti-disable-version-symlinks.patch"
|
"ganeti-disable-version-symlinks.patch"
|
||||||
"ganeti-preserve-PYTHONPATH.patch"))))
|
"ganeti-preserve-PYTHONPATH.patch"))))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2020 Marius Bakke <marius@gnu.org>.
|
;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
|
||||||
;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
|
;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
|
@ -52,17 +52,17 @@ (define %ganeti-os
|
||||||
(hosts-file (plain-file "hosts" (format #f "
|
(hosts-file (plain-file "hosts" (format #f "
|
||||||
127.0.0.1 localhost
|
127.0.0.1 localhost
|
||||||
::1 localhost
|
::1 localhost
|
||||||
10.0.2.2 gnt1.example.com gnt1
|
10.0.2.15 gnt1.example.com gnt1
|
||||||
192.168.254.254 ganeti.example.com
|
192.168.254.254 ganeti.example.com
|
||||||
")))
|
")))
|
||||||
|
|
||||||
(packages (append (list ganeti-instance-debootstrap ganeti-instance-guix)
|
(packages (append (list ganeti-instance-debootstrap ganeti-instance-guix)
|
||||||
%base-packages))
|
%base-packages))
|
||||||
(services
|
(services
|
||||||
(append (list (static-networking-service "eth0" "10.0.2.2"
|
(append (list (static-networking-service "eth0" "10.0.2.15"
|
||||||
#:netmask "255.255.255.0"
|
#:netmask "255.255.255.0"
|
||||||
#:gateway "10.0.2.1"
|
#:gateway "10.0.2.2"
|
||||||
#:name-servers '("10.0.2.1"))
|
#:name-servers '("10.0.2.3"))
|
||||||
|
|
||||||
(service openssh-service-type
|
(service openssh-service-type
|
||||||
(openssh-configuration
|
(openssh-configuration
|
||||||
|
@ -83,8 +83,7 @@ (define* (run-ganeti-test hypervisor #:key
|
||||||
(master-netdev "eth0")
|
(master-netdev "eth0")
|
||||||
(hvparams '())
|
(hvparams '())
|
||||||
(extra-packages '())
|
(extra-packages '())
|
||||||
(rapi-port 5080)
|
(rapi-port 5080))
|
||||||
(noded-port 1811))
|
|
||||||
"Run tests in %GANETI-OS."
|
"Run tests in %GANETI-OS."
|
||||||
(define os
|
(define os
|
||||||
(marionette-operating-system
|
(marionette-operating-system
|
||||||
|
@ -96,7 +95,6 @@ (define os
|
||||||
(guix combinators))))
|
(guix combinators))))
|
||||||
|
|
||||||
(define %forwarded-rapi-port 5080)
|
(define %forwarded-rapi-port 5080)
|
||||||
(define %forwarded-noded-port 1811)
|
|
||||||
|
|
||||||
(define vm
|
(define vm
|
||||||
(virtual-machine
|
(virtual-machine
|
||||||
|
@ -104,14 +102,14 @@ (define vm
|
||||||
;; Some of the daemons are fairly memory-hungry.
|
;; Some of the daemons are fairly memory-hungry.
|
||||||
(memory-size 512)
|
(memory-size 512)
|
||||||
;; Forward HTTP ports so we can access them from the "outside".
|
;; Forward HTTP ports so we can access them from the "outside".
|
||||||
(port-forwardings `((,%forwarded-rapi-port . ,rapi-port)
|
(port-forwardings `((,%forwarded-rapi-port . ,rapi-port)))))
|
||||||
(,%forwarded-noded-port . ,noded-port)))))
|
|
||||||
|
|
||||||
(define test
|
(define test
|
||||||
(with-imported-modules '((gnu build marionette))
|
(with-imported-modules '((gnu build marionette))
|
||||||
#~(begin
|
#~(begin
|
||||||
(use-modules (srfi srfi-11) (srfi srfi-64)
|
(use-modules (srfi srfi-11) (srfi srfi-64)
|
||||||
(web uri) (web client) (web response)
|
(web uri) (web client) (web response)
|
||||||
|
(ice-9 iconv)
|
||||||
(gnu build marionette))
|
(gnu build marionette))
|
||||||
|
|
||||||
(define marionette
|
(define marionette
|
||||||
|
@ -213,18 +211,19 @@ (define marionette
|
||||||
"watcher" "continue"))
|
"watcher" "continue"))
|
||||||
marionette))
|
marionette))
|
||||||
|
|
||||||
;; Try accessing the RAPI. This causes an expected failure:
|
;; Try accessing the RAPI.
|
||||||
;; https://github.com/ganeti/ganeti/issues/1502
|
|
||||||
;; Run it anyway for easy testing of potential fixes.
|
|
||||||
(test-equal "http-get RAPI version"
|
(test-equal "http-get RAPI version"
|
||||||
'(200 "2")
|
'(200 "2\n")
|
||||||
(let-values
|
(let-values
|
||||||
(((response text)
|
(((response text)
|
||||||
(http-get #$(simple-format
|
(http-get #$(simple-format
|
||||||
#f "http://localhost:~A/version"
|
#f "http://localhost:~A/version"
|
||||||
%forwarded-rapi-port)
|
%forwarded-rapi-port)
|
||||||
#:decode-body? #t)))
|
#:decode-body? #f)))
|
||||||
(list (response-code response) text)))
|
(list (response-code response)
|
||||||
|
;; The API response lacks a content-type, so
|
||||||
|
;; (http-client) won't decode it for us.
|
||||||
|
(bytevector->string text "UTF-8"))))
|
||||||
|
|
||||||
(test-equal "gnt-os list"
|
(test-equal "gnt-os list"
|
||||||
"debootstrap+default\nguix+default\n"
|
"debootstrap+default\nguix+default\n"
|
||||||
|
@ -249,7 +248,7 @@ (define marionette
|
||||||
marionette))
|
marionette))
|
||||||
|
|
||||||
(test-end)
|
(test-end)
|
||||||
(exit (= (test-runner-fail-count (test-runner-current)) 1)))))
|
(exit (= (test-runner-fail-count (test-runner-current)) 0)))))
|
||||||
|
|
||||||
(gexp->derivation (string-append "ganeti-" hypervisor "-test") test))
|
(gexp->derivation (string-append "ganeti-" hypervisor "-test") test))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue