projects/guix·blob kernel-updates · refs

212 lines · 6.6 KiB

1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2017 Christopher Baines <[email protected]>
3;;; Copyright © 2025-2026 Artur Wroblewski <[email protected]>
4;;;
5;;; This file is part of GNU Guix.
6;;;
7;;; GNU Guix is free software; you can redistribute it and/or modify it
8;;; under the terms of the GNU General Public License as published by
9;;; the Free Software Foundation; either version 3 of the License, or (at
10;;; your option) any later version.
11;;;
12;;; GNU Guix is distributed in the hope that it will be useful, but
13;;; WITHOUT ANY WARRANTY; without even the implied warranty of
14;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;;; GNU General Public License for more details.
16;;;
17;;; You should have received a copy of the GNU General Public License
18;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
19
20(define-module (gnu tests high-availability)
21 #:use-module (gnu tests)
22 #:use-module (gnu packages erlang)
23 #:use-module (gnu packages high-availability)
24 #:use-module (gnu system)
25 #:use-module (gnu system file-systems)
26 #:use-module (gnu system shadow)
27 #:use-module (gnu system vm)
28 #:use-module (gnu services)
29 #:use-module (gnu services high-availability)
30 #:use-module (gnu services networking)
31 #:use-module (guix gexp)
32 #:use-module (guix store)
33 #:export (%test-epmd
34 %test-rabbitmq))
35
36;;;
37;;; Erlang Port Mapper Daemon (epmd) service.
38;;;
39(define %epmd-os
40 (simple-operating-system
41 (service epmd-service-type
42 (epmd-configuration (port 14369)))))
43
44(define* (run-epmd-test #:key (epmd-port 14369))
45 "Run tests in %EPMD-OS, forwarding PORT."
46 (define os
47 (marionette-operating-system
48 %epmd-os
49 #:imported-modules '((gnu services herd)
50 (guix combinators))))
51
52 (define forwarded-port 14369)
53
54 (define vm
55 (virtual-machine
56 (operating-system os)
57 (memory-size 512)
58 (port-forwardings `((,epmd-port . ,forwarded-port)))))
59
60 (define test
61 (with-imported-modules '((gnu build marionette))
62 #~(begin
63 (use-modules (srfi srfi-64)
64 (gnu build marionette)
65 (ice-9 rdelim))
66
67 (define marionette
68 (make-marionette (list #$vm)))
69
70 (mkdir #$output)
71 (chdir #$output)
72
73 (test-runner-current (system-test-runner #$output))
74 (test-begin "epmd")
75
76 ;; Wait for epmd to be up and running.
77 (test-assert "service running"
78 (marionette-eval
79 '(begin
80 (use-modules (gnu services herd))
81 (match (start-service 'epmd)
82 (#f #f)
83 (('service response-parts ...)
84 (match (assq-ref response-parts 'running)
85 ((#t) #t)
86 ((pid) pid)))))
87 marionette))
88
89 (test-assert "epmd port ready"
90 (wait-for-tcp-port #$forwarded-port marionette))
91
92 (test-assert "epmd connection is successful"
93 (marionette-eval
94 '(begin
95 (use-modules (guix build utils))
96
97 (current-output-port (open-file "/dev/console" "w0"))
98 (invoke #$(file-append erlang "/bin/epmd")
99 "-port"
100 "14369"
101 "-names"))
102 marionette))
103 (test-end))))
104
105 (gexp->derivation "epmd-test" test))
106
107(define %test-epmd
108 (system-test
109 (name "epmd")
110 (description "Connect to a running epmd service.")
111 (value (run-epmd-test))))
112
113(define %rabbitmq-config-file
114 (plain-file "rabbitmq.conf" "
115listeners.tcp.1 = 127.0.0.1:15672
116listeners.tcp.2 = ::1:15672
117
118distribution.listener.interface = 127.0.0.1
119"))
120
121(define %rabbitmq-os
122 (simple-operating-system
123 (service epmd-service-type)
124 (service rabbitmq-service-type
125 (rabbitmq-configuration (node-name "rabbit@komputilo")
126 (config-file %rabbitmq-config-file)))))
127
128(define* (run-rabbitmq-test #:key (rabbitmq-port 15672))
129 "Run tests in %RABBITMQ-OS, forwarding PORT."
130 (define os
131 (marionette-operating-system
132 %rabbitmq-os
133 #:imported-modules '((gnu services herd)
134 (guix combinators))))
135
136 (define forwarded-port 15672)
137
138 (define vm
139 (virtual-machine
140 (operating-system os)
141 (memory-size 512)
142 (port-forwardings `((,rabbitmq-port . ,forwarded-port)))))
143
144 (define test
145 (with-imported-modules '((gnu build marionette))
146 #~(begin
147 (use-modules (srfi srfi-64)
148 (gnu build marionette)
149 (ice-9 rdelim))
150
151 (define marionette
152 (make-marionette (list #$vm)))
153
154 (mkdir #$output)
155 (chdir #$output)
156
157 (test-runner-current (system-test-runner #$output))
158 (test-begin "rabbitmq")
159
160 ;; Wait for RabbitMQ broker to be up and running.
161 (test-assert "service running"
162 (marionette-eval
163 '(begin
164 (use-modules (gnu services herd))
165 (match (start-service 'rabbitmq)
166 (#f #f)
167 (('service response-parts ...)
168 (match (assq-ref response-parts 'running)
169 ((#t) #t)
170 ((pid) pid)))))
171 marionette))
172
173 (test-assert "RabbitMQ port ready"
174 (wait-for-tcp-port #$forwarded-port marionette))
175
176 (test-assert "RabbitMQ log file exists"
177 (marionette-eval
178 '(file-exists? "/var/log/rabbitmq/[email protected]")
179 marionette))
180
181 (test-assert "RabbitMQ await startup command is successful"
182 (marionette-eval
183 '(begin
184 (use-modules (guix build utils))
185
186 (current-output-port (open-file "/dev/console" "w0"))
187 (invoke #$(file-append rabbitmq "/sbin/rabbitmqctl")
188 "await_startup"
189 "-n"
190 "rabbit@komputilo"))
191 marionette))
192
193 (test-assert "RabbitMQ status command is successful"
194 (marionette-eval
195 '(begin
196 (use-modules (guix build utils))
197
198 (current-output-port (open-file "/dev/console" "w0"))
199 (invoke #$(file-append rabbitmq "/sbin/rabbitmqctl")
200 "status"
201 "-n"
202 "rabbit@komputilo"))
203 marionette))
204 (test-end))))
205
206 (gexp->derivation "rabbitmq-test" test))
207
208(define %test-rabbitmq
209 (system-test
210 (name "rabbitmq")
211 (description "Connect to a running RABBITMQ server.")
212 (value (run-rabbitmq-test))))