services: monitoring: Add 'zabbix-agent'.
[jackhill/guix/guix.git] / gnu / tests / monitoring.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2018 Gábor Boskovits <boskovits@gmail.com>
3 ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
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 monitoring)
21 #:use-module (gnu packages databases)
22 #:use-module (gnu packages monitoring)
23 #:use-module (gnu services)
24 #:use-module (gnu services monitoring)
25 #:use-module (gnu services networking)
26 #:use-module (gnu services databases)
27 #:use-module (gnu services shepherd)
28 #:use-module (gnu system vm)
29 #:use-module (gnu system)
30 #:use-module (gnu tests)
31 #:use-module (guix gexp)
32 #:export (%test-prometheus-node-exporter
33 %test-zabbix))
34
35 \f
36 ;;;
37 ;;; Prometheus Node Exporter
38 ;;;
39
40 (define* (run-prometheus-node-exporter-server-test name test-os)
41 "Run tests in %PROMETHEUS-NODE-EXPORTER-OS, which has prometheus-node-exporter running."
42 (define os
43 (marionette-operating-system
44 test-os
45 #:imported-modules '((gnu services herd))))
46
47 (define vm
48 (virtual-machine
49 (operating-system os)
50 (port-forwardings '((8080 . 9100)))))
51
52 (define test
53 (with-imported-modules '((gnu build marionette))
54 #~(begin
55 (use-modules (srfi srfi-11)
56 (srfi srfi-64)
57 (gnu build marionette)
58 (web client)
59 (web response))
60
61 (define marionette
62 (make-marionette (list #$vm)))
63
64 (mkdir #$output)
65 (chdir #$output)
66
67 (test-begin #$name)
68
69 (test-assert "prometheus-node-exporter running"
70 (marionette-eval
71 '(begin
72 (use-modules (gnu services herd))
73 (match (start-service 'prometheus-node-exporter)
74 (#f #f)
75 (('service response-parts ...)
76 (match (assq-ref response-parts 'running)
77 ((pid) (number? pid))))))
78 marionette))
79
80 (test-equal "http-get"
81 200
82 (begin
83 (wait-for-tcp-port 9100 marionette)
84 (let-values (((response text)
85 (http-get "http://localhost:8080")))
86 (response-code response))))
87
88 (test-end)
89 (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
90
91 (gexp->derivation (string-append name "-test") test))
92
93 (define %prometheus-node-exporter-os
94 (simple-operating-system
95 (service dhcp-client-service-type)
96 (service prometheus-node-exporter-service-type
97 (prometheus-node-exporter-configuration))))
98
99 (define %test-prometheus-node-exporter
100 (system-test
101 (name "prometheus-node-exporter")
102 (description "Connect to a running prometheus-node-exporter server.")
103 (value (run-prometheus-node-exporter-server-test
104 name %prometheus-node-exporter-os))))
105
106 \f
107 ;;;
108 ;;; Zabbix
109 ;;;
110
111 (define %psql-user-create-zabbix
112 "\
113 sudo -u postgres psql <<< \"create user zabbix password 'zabbix';\"
114 ")
115
116 (define %psql-db-zabbix-create-script
117 "\
118 sudo -u postgres psql --no-align <<< \\\\du
119 ")
120
121 (define %psql-db-create-zabbix
122 "\
123 sudo -u postgres createdb -O zabbix -E Unicode -T template0 zabbix
124 ")
125
126 (define %psql-db-import-zabbix
127 #~(format #f "\
128 cat ~a | sudo -u zabbix psql zabbix;
129 cat ~a | sudo -u zabbix psql zabbix;
130 cat ~a | sudo -u zabbix psql zabbix;
131 "
132 (string-append #$zabbix-server:schema
133 "/database/postgresql/schema.sql")
134 (string-append #$zabbix-server:schema
135 "/database/postgresql/images.sql")
136 (string-append #$zabbix-server:schema
137 "/database/postgresql/data.sql")))
138
139 (define* (run-zabbix-server-test name test-os)
140 "Run tests in %ZABBIX-OS, which has zabbix running."
141 (define os
142 (marionette-operating-system
143 test-os
144 #:imported-modules '((gnu services herd))))
145
146 (define vm
147 (virtual-machine
148 (operating-system os)
149 (port-forwardings '((8080 . 80)))
150 (memory-size 1024)))
151
152 (define test
153 (with-imported-modules '((gnu build marionette))
154 #~(begin
155 (use-modules (srfi srfi-11)
156 (srfi srfi-64)
157 (gnu build marionette)
158 (web client)
159 (web response)
160 (ice-9 popen)
161 (ice-9 rdelim))
162
163 (define marionette
164 (make-marionette (list #$vm)))
165
166 (mkdir #$output)
167 (chdir #$output)
168
169 (test-begin #$name)
170
171 ;; XXX: Shepherd reads the config file *before* binding its control
172 ;; socket, so /var/run/shepherd/socket might not exist yet when the
173 ;; 'marionette' service is started.
174 (test-assert "shepherd socket ready"
175 (marionette-eval
176 `(begin
177 (use-modules (gnu services herd))
178 (let loop ((i 10))
179 (cond ((file-exists? (%shepherd-socket-file))
180 #t)
181 ((> i 0)
182 (sleep 1)
183 (loop (- i 1)))
184 (else
185 'failure))))
186 marionette))
187
188 (test-assert "postgres service running"
189 (marionette-eval
190 '(begin
191 (use-modules (gnu services herd))
192 (start-service 'postgres))
193 marionette))
194
195 (test-eq "postgres create zabbix user"
196 0
197 (marionette-eval '(begin (system #$%psql-user-create-zabbix))
198 marionette))
199
200 (test-equal "postgres find zabbix user"
201 "List of roles
202 Role name|Attributes|Member of
203 postgres|Superuser, Create role, Create DB, Replication, Bypass RLS|{}
204 zabbix||{}
205 "
206 (marionette-eval
207 '(begin (let* ((port (open-pipe #$%psql-db-zabbix-create-script
208 OPEN_READ))
209 (output (read-string port))
210 (status (close-pipe port)))
211 output))
212 marionette))
213
214 (test-eq "postgres create zabbix db"
215 0
216 (marionette-eval '(begin (system #$%psql-db-create-zabbix))
217 marionette))
218
219 (test-eq "postgres import zabbix db"
220 0
221 (marionette-eval '(begin (system #$%psql-db-import-zabbix))
222 marionette))
223
224 ;; Wait for zabbix-server to be up and running.
225 (test-assert "zabbix-server running"
226 (marionette-eval
227 '(begin
228 (use-modules (gnu services herd))
229 (start-service 'zabbix-server))
230 marionette))
231
232 ;; Make sure the PID file is created.
233 (test-assert "zabbix-server PID file"
234 (marionette-eval
235 '(file-exists? "/var/run/zabbix/zabbix_server.pid")
236 marionette))
237
238 ;; Wait for zabbix-agent to be up and running.
239 (test-assert "zabbix-agent running"
240 (marionette-eval
241 '(begin
242 (use-modules (gnu services herd))
243 (start-service 'zabbix-agent))
244 marionette))
245
246 ;; Make sure the PID file is created.
247 (test-assert "zabbix-agent PID file"
248 (marionette-eval
249 '(file-exists? "/var/run/zabbix/zabbix_agent.pid")
250 marionette))
251
252 (test-end)
253
254 (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
255
256 (gexp->derivation (string-append name "-test") test))
257
258 (define %zabbix-os
259 ;; Return operating system under test.
260 (let ((base-os
261 (simple-operating-system
262 (service dhcp-client-service-type)
263 (postgresql-service)
264 (service zabbix-server-service-type
265 (zabbix-server-configuration
266 (db-password "zabbix")
267 (log-type "console")))
268
269 (service zabbix-agent-service-type))))
270 (operating-system
271 (inherit base-os)
272 (packages (cons* postgresql (operating-system-packages base-os))))))
273
274 (define %test-zabbix
275 (system-test
276 (name "zabbix")
277 (description "Connect to a running Zabbix")
278 (value (run-zabbix-server-test name %zabbix-os))))