Gentoo Archives: gentoo-commits

From: Andrea Postiglione <andrea.postiglione@×××××.com>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/proj/guru:dev commit in: sys-cluster/pcs/files/, sys-cluster/pcs/
Date: Sun, 03 Apr 2022 14:06:03
Message-Id: 1648994705.e7063905e35ee1725909a63cc0227f877d02c1a9.andrea_postiglione@gentoo
1 commit: e7063905e35ee1725909a63cc0227f877d02c1a9
2 Author: Andrea Postiglione <andrea.postiglione <AT> gmail <DOT> com>
3 AuthorDate: Sun Apr 3 14:05:05 2022 +0000
4 Commit: Andrea Postiglione <andrea.postiglione <AT> gmail <DOT> com>
5 CommitDate: Sun Apr 3 14:05:05 2022 +0000
6 URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=e7063905
7
8 sys-cluster/pcs 0.11.2 first release
9
10 Signed-off-by: Andrea Postiglione <andrea.postiglione <AT> gmail.com>
11
12 sys-cluster/pcs/Manifest | 1 +
13 .../pcs/files/pcs-0.11-gentoo-support.patch | 516 +++++++++++++++++++++
14 sys-cluster/pcs/files/pcs-0.11.initd | 35 ++
15 sys-cluster/pcs/files/pcsd-0.11.initd | 27 ++
16 sys-cluster/pcs/pcs-0.11.2.ebuild | 110 +++++
17 5 files changed, 689 insertions(+)
18
19 diff --git a/sys-cluster/pcs/Manifest b/sys-cluster/pcs/Manifest
20 index 95eae5e99..3b8504e14 100644
21 --- a/sys-cluster/pcs/Manifest
22 +++ b/sys-cluster/pcs/Manifest
23 @@ -1 +1,2 @@
24 DIST pcs-0.10.8.tar.gz 1852902 BLAKE2B ef023ca27c2dbd1d765e1d68f67a55c79f57b1dbc7d571b8f21e1c30f8a8510b1148459a0e683c682fb969c7635ef726c8e227b995d1a35dfd27894f40bdaa26 SHA512 8b9ba62279431e481d062e804d24480d2a274d2f4897a82149df6116ff3df2394d97a3ee77a6dee4c563d915bab0142124a8942524fcc4e894912086e865353c
25 +DIST pcs-0.11.2.tar.gz 1412048 BLAKE2B f94459516f3ad29061a80b3fbeb228eef687c7cbb181bd0af219e410d53b7618eb029a52d4cab8599511455183ecbc01e64ef3d5735350834bccf51b51aa291c SHA512 ee610a7626de8c6abeffc23943fd95250c8550bbff946cffed8f18748bb862694f7cbc384127e0f062f121f3c31b8197b4b5d4eb150c3efcb8045809e54c0bf5
26
27 diff --git a/sys-cluster/pcs/files/pcs-0.11-gentoo-support.patch b/sys-cluster/pcs/files/pcs-0.11-gentoo-support.patch
28 new file mode 100644
29 index 000000000..d2e6fb804
30 --- /dev/null
31 +++ b/sys-cluster/pcs/files/pcs-0.11-gentoo-support.patch
32 @@ -0,0 +1,516 @@
33 +diff -uPNr pcs-0.11.2/configure.ac pcs-0.11.2-openrc/configure.ac
34 +--- pcs-0.11.2/configure.ac 2022-02-03 13:37:44.000000000 +0100
35 ++++ pcs-0.11.2-openrc/configure.ac 2022-04-02 16:47:45.968552397 +0200
36 +@@ -89,17 +89,17 @@
37 + ])
38 +
39 + # check for systemd
40 +-PKG_CHECK_MODULES([systemd], [systemd])
41 +-PCS_PKG_CHECK_VAR([SYSTEMD_UNIT_DIR_TMP], [systemd], [systemdsystemunitdir], [/usr/lib/systemd/system])
42 +-if test "${prefix}" != "/usr"; then
43 +- SYSTEMD_UNIT_DIR="${prefix}/$SYSTEMD_UNIT_DIR_TMP"
44 +-else
45 +- SYSTEMD_UNIT_DIR="$SYSTEMD_UNIT_DIR_TMP"
46 +-fi
47 +-AC_SUBST([SYSTEMD_UNIT_DIR])
48 +-PCS_PKG_CHECK_VAR([SYSTEMD_UNIT_PATH], [systemd], [systemdsystemunitpath],
49 +- [/etc/systemd/system:/etc/systemd/system:/run/systemd/system:/usr/local/lib/systemd/system:/usr/lib/systemd/system:/usr/lib/systemd/system:/lib/systemd/system])
50 +-AC_SUBST([SYSTEMD_UNIT_PATH])
51 ++#PKG_CHECK_MODULES([systemd], [systemd])
52 ++#PCS_PKG_CHECK_VAR([SYSTEMD_UNIT_DIR_TMP], [systemd], [systemdsystemunitdir], [/usr/lib/systemd/system])
53 ++#if test "${prefix}" != "/usr"; then
54 ++# SYSTEMD_UNIT_DIR="${prefix}/$SYSTEMD_UNIT_DIR_TMP"
55 ++#else
56 ++# SYSTEMD_UNIT_DIR="$SYSTEMD_UNIT_DIR_TMP"
57 ++#fi
58 ++#AC_SUBST([SYSTEMD_UNIT_DIR])
59 ++#PCS_PKG_CHECK_VAR([SYSTEMD_UNIT_PATH], [systemd], [systemdsystemunitpath],
60 ++# [/etc/systemd/system:/etc/systemd/system:/run/systemd/system:/usr/local/lib/systemd/system:/usr/lib/systemd/system:/usr/lib/systemd/system:/lib/systemd/system])
61 ++#AC_SUBST([SYSTEMD_UNIT_PATH])
62 +
63 + # check for ruby
64 + AC_PATH_PROG([RUBY], [ruby])
65 +@@ -217,6 +217,15 @@
66 + DISTROEXT=fedora
67 + break
68 + ;;
69 ++ gentoo)
70 ++ FOUND_DISTRO=1
71 ++ CONFIGDIR="$sysconfdir/default"
72 ++ PCSLIBDIR="$prefix/share"
73 ++ PCMKDAEMONDIR="$prefix/libexec/pacemaker"
74 ++ COROSYNCLOGDIR="$localstatedir/log/corosync"
75 ++ DISTROEXT=gentoo
76 ++ break
77 ++ ;;
78 + esac
79 + done
80 +
81 +@@ -396,9 +405,9 @@
82 + fi
83 + AC_PATH_PROG([SYSTEMCTL], [systemctl])
84 + if test "x$SYSTEMCTL" = "x"; then
85 +- AC_PATH_PROG([SERVICE], [service])
86 ++ AC_PATH_PROG([SERVICE], [rc-service])
87 + if test "x$SERVICE" = "x"; then
88 +- AC_MSG_ERROR([Unable to find systemctl or service in $PATH])
89 ++ AC_MSG_ERROR([Unable to find systemctl or rc-service in $PATH])
90 + fi
91 + fi
92 +
93 +diff -uPNr pcs-0.11.2/pcs/common/services/drivers/__init__.py pcs-0.11.2-openrc/pcs/common/services/drivers/__init__.py
94 +--- pcs-0.11.2/pcs/common/services/drivers/__init__.py 2022-02-03 13:37:44.000000000 +0100
95 ++++ pcs-0.11.2-openrc/pcs/common/services/drivers/__init__.py 2022-04-01 20:20:31.536218481 +0200
96 +@@ -1,2 +1,3 @@
97 + from .systemd import SystemdDriver
98 + from .sysvinit_rhel import SysVInitRhelDriver
99 ++from .openrc_gentoo import OpenRCGentooDriver
100 +diff -uPNr pcs-0.11.2/pcs/common/services/drivers/openrc_gentoo.py pcs-0.11.2-openrc/pcs/common/services/drivers/openrc_gentoo.py
101 +--- pcs-0.11.2/pcs/common/services/drivers/openrc_gentoo.py 1970-01-01 01:00:00.000000000 +0100
102 ++++ pcs-0.11.2-openrc/pcs/common/services/drivers/openrc_gentoo.py 2022-04-01 19:52:57.765788816 +0200
103 +@@ -0,0 +1,87 @@
104 ++import os.path
105 ++from typing import (
106 ++ List,
107 ++ Optional,
108 ++)
109 ++
110 ++from .. import errors
111 ++from ..interfaces import (
112 ++ ExecutorInterface,
113 ++ ServiceManagerInterface,
114 ++)
115 ++
116 ++
117 ++class OpenRCGentooDriver(ServiceManagerInterface):
118 ++ def __init__(
119 ++ self, executor: ExecutorInterface, rc_service_bin: str, rc_config_bin: str
120 ++ ):
121 ++ """
122 ++ executor -- external commands used by this class are executed using
123 ++ this object
124 ++ rc_service_bin -- path to an executable used for starting and stopping
125 ++ services and to check if a service is running
126 ++ rc_config_bin -- path to an executable used for enabling, disabling and
127 ++ listing available service and to check if service is enabled
128 ++ """
129 ++ self._executor = executor
130 ++ self._rc_config_bin = rc_config_bin
131 ++ self._rc_service_bin = rc_service_bin
132 ++ self._available_services: List[str] = []
133 ++
134 ++ def start(self, service: str, instance: Optional[str] = None) -> None:
135 ++ result = self._executor.run([self._rc_service_bin, service, "start"])
136 ++ if result.retval != 0:
137 ++ raise errors.StartServiceError(service, result.joined_output)
138 ++
139 ++ def stop(self, service: str, instance: Optional[str] = None) -> None:
140 ++ result = self._executor.run([self._rc_service_bin, service, "stop"])
141 ++ if result.retval != 0:
142 ++ raise errors.StopServiceError(service, result.joined_output)
143 ++
144 ++ def enable(self, service: str, instance: Optional[str] = None) -> None:
145 ++ result = self._executor.run([self._rc_config_bin, "add", service, "default"])
146 ++ if result.retval != 0:
147 ++ raise errors.EnableServiceError(service, result.joined_output)
148 ++
149 ++ def disable(self, service: str, instance: Optional[str] = None) -> None:
150 ++ if not self.is_installed(service):
151 ++ return
152 ++ result = self._executor.run([self._rc_config_bin, "delete", service, "default"])
153 ++ if result.retval != 0:
154 ++ raise errors.DisableServiceError(service, result.joined_output)
155 ++
156 ++ def is_enabled(self, service: str, instance: Optional[str] = None) -> bool:
157 ++ if not self._available_services:
158 ++ self._available_services = self._get_available_services()
159 ++ return ( service in self._available_services )
160 ++
161 ++ def is_running(self, service: str, instance: Optional[str] = None) -> bool:
162 ++ result = self._executor.run([self._rc_service_bin, service, "status"]).stdout
163 ++ return( result == " * status: started" )
164 ++
165 ++ def is_installed(self, service: str) -> bool:
166 ++ return service in self.get_available_services()
167 ++
168 ++ def get_available_services(self) -> List[str]:
169 ++ if not self._available_services:
170 ++ self._available_services = self._get_available_services()
171 ++ return self._available_services
172 ++
173 ++ def _get_available_services(self) -> List[str]:
174 ++ result = self._executor.run([self._rc_config_bin])
175 ++ if result.retval != 0:
176 ++ return []
177 ++
178 ++ service_list = []
179 ++ # skip first string that say 'Init scripts to be started by runlevel default'
180 ++ for service in result.stdout.splitlines()[1:]:
181 ++ service = service.strip()
182 ++ if service:
183 ++ service_list.append(service)
184 ++ return service_list
185 ++
186 ++ def is_current_system_supported(self) -> bool:
187 ++ return all(
188 ++ os.path.isfile(binary)
189 ++ for binary in (self._rc_service_bin, self._rc_config_bin)
190 ++ )
191 +diff -uPNr pcs-0.11.2/pcs/lib/services.py pcs-0.11.2-openrc/pcs/lib/services.py
192 +--- pcs-0.11.2/pcs/lib/services.py 2022-02-03 13:37:44.000000000 +0100
193 ++++ pcs-0.11.2-openrc/pcs/lib/services.py 2022-04-01 20:02:05.023001421 +0200
194 +@@ -84,6 +84,9 @@
195 + services.drivers.SysVInitRhelDriver(
196 + executor, settings.service_binary, settings.chkconfig_binary
197 + ),
198 ++ service.drivers.OpenRCGentooDriver(
199 ++ executor, settings.rc_config_binary, settings.rc_service_binary
200 ++ ),
201 + ]
202 +
203 + for driver in drivers:
204 +diff -uPNr pcs-0.11.2/pcs/Makefile.am pcs-0.11.2-openrc/pcs/Makefile.am
205 +--- pcs-0.11.2/pcs/Makefile.am 2022-02-03 13:37:44.000000000 +0100
206 ++++ pcs-0.11.2-openrc/pcs/Makefile.am 2022-04-01 20:22:42.198605061 +0200
207 +@@ -131,6 +131,7 @@
208 + common/services/drivers/__init__.py \
209 + common/services/drivers/systemd.py \
210 + common/services/drivers/sysvinit_rhel.py \
211 ++ common/services/drivers/openrc_gentoo.py \
212 + common/services_dto.py \
213 + common/services/errors.py \
214 + common/services/__init__.py \
215 +diff -uPNr pcs-0.11.2/pcs/settings.py.in pcs-0.11.2-openrc/pcs/settings.py.in
216 +--- pcs-0.11.2/pcs/settings.py.in 2022-02-03 13:37:44.000000000 +0100
217 ++++ pcs-0.11.2-openrc/pcs/settings.py.in 2022-04-03 14:09:08.438232140 +0200
218 +@@ -4,6 +4,8 @@
219 + systemd_unit_path = "@SYSTEMD_UNIT_PATH@".split(":")
220 + chkconfig_binary = "/sbin/chkconfig"
221 + service_binary = "@SERVICE@"
222 ++rc_config_binary = "/usr/bin/rc-config"
223 ++rc_service_binary = "/sbin/rc-service"
224 + # Used only in utils.py in deprecated funcion
225 + pacemaker_binaries = "@PCMKEXECPREFIX@/sbin"
226 + corosync_binaries = "@COROEXECPREFIX@/sbin"
227 +@@ -52,8 +54,8 @@
228 + cibadmin = "@PCMKEXECPREFIX@/sbin/cibadmin"
229 + crm_mon_schema = "@PCMK_SCHEMA_DIR@/crm_mon.rng"
230 + pacemaker_api_result_schema = "@PCMK_SCHEMA_DIR@/api/api-result.rng"
231 +-pcsd_var_location = "@LOCALSTATEDIR@/lib/pcsd"
232 +-pcsd_ruby_socket = "@LOCALSTATEDIR@/run/pcsd-ruby.socket"
233 ++pcsd_var_location = "/var/lib/pcsd"
234 ++pcsd_ruby_socket = "/var/run/pcsd.socket"
235 + pcsd_cert_location = os.path.join(pcsd_var_location, "pcsd.crt")
236 + pcsd_key_location = os.path.join(pcsd_var_location, "pcsd.key")
237 + pcsd_known_hosts_location = os.path.join(pcsd_var_location, "known-hosts")
238 +@@ -63,7 +65,7 @@
239 + )
240 + pcsd_dr_config_location = os.path.join(pcsd_var_location, "disaster-recovery")
241 + pcsd_exec_location = "@LIB_DIR@/pcsd"
242 +-pcsd_log_location = "@LOCALSTATEDIR@/log/pcsd/pcsd.log"
243 ++pcsd_log_location = "/var/log/pcsd/pcsd.log"
244 + pcsd_default_port = 2224
245 + pcsd_config = "@CONF_DIR@/pcsd"
246 + cib_dir = "@PCMK_CIB_DIR@"
247 +diff -uPNr pcs-0.11.2/pcsd/logrotate/pcsd.in pcs-0.11.2-openrc/pcsd/logrotate/pcsd.in
248 +--- pcs-0.11.2/pcsd/logrotate/pcsd.in 2022-02-03 13:37:44.000000000 +0100
249 ++++ pcs-0.11.2-openrc/pcsd/logrotate/pcsd.in 2022-04-02 18:35:15.265764389 +0200
250 +@@ -1,4 +1,4 @@
251 +-@localstatedir@/log/pcsd/*.log {
252 ++/var/log/pcsd/*.log {
253 + rotate 5
254 + weekly
255 + missingok
256 +diff -uPNr pcs-0.11.2/pcsd/Makefile.am pcs-0.11.2-openrc/pcsd/Makefile.am
257 +--- pcs-0.11.2/pcsd/Makefile.am 2022-02-03 13:37:44.000000000 +0100
258 ++++ pcs-0.11.2-openrc/pcsd/Makefile.am 2022-04-02 18:34:42.609049415 +0200
259 +@@ -80,8 +80,8 @@
260 + cp -rp ../${PCSD_BUNDLED_DIR_ROOT_LOCAL}/* $(DESTDIR)${GEM_HOME}
261 + rm -rf $(DESTDIR)${GEM_HOME}/cache
262 + endif
263 +- $(MKDIR_P) -m 0700 $(DESTDIR)$(localstatedir)/log/pcsd
264 +- $(MKDIR_P) -m 0700 $(DESTDIR)$(localstatedir)/lib/pcsd
265 ++ $(MKDIR_P) -m 0700 $(DESTDIR)/var/log/pcsd
266 ++ $(MKDIR_P) -m 0700 $(DESTDIR)/var/lib/pcsd
267 +
268 + uninstall-local:
269 + rm -rf $(DESTDIR)/$(sysconfdir)/pam.d/pcsd
270 +@@ -89,5 +89,5 @@
271 + if INSTALL_EMBEDDED_GEMS
272 + rm -rf $(DESTDIR)/${GEM_HOME}
273 + endif
274 +- rmdir $(DESTDIR)/$(localstatedir)/log/pcsd 2>/dev/null || :
275 +- rmdir $(DESTDIR)/$(localstatedir)/lib/pcsd 2>/dev/null || :
276 ++ rmdir $(DESTDIR)/var/log/pcsd 2>/dev/null || :
277 ++ rmdir $(DESTDIR)/var/lib/pcsd 2>/dev/null || :
278 +diff -uPNr pcs-0.11.2/pcsd/pam/pcsd.gentoo pcs-0.11.2-openrc/pcsd/pam/pcsd.gentoo
279 +--- pcs-0.11.2/pcsd/pam/pcsd.gentoo 1970-01-01 01:00:00.000000000 +0100
280 ++++ pcs-0.11.2-openrc/pcsd/pam/pcsd.gentoo 2022-04-02 12:58:06.249036062 +0200
281 +@@ -0,0 +1,5 @@
282 ++#%PAM-1.0
283 ++auth include system-auth
284 ++account include system-auth
285 ++password include system-auth
286 ++session include system-auth
287 +diff -uPNr pcs-0.11.2/pcsd/settings.rb.in pcs-0.11.2-openrc/pcsd/settings.rb.in
288 +--- pcs-0.11.2/pcsd/settings.rb.in 2022-02-03 13:37:44.000000000 +0100
289 ++++ pcs-0.11.2-openrc/pcsd/settings.rb.in 2022-04-03 14:08:03.767014211 +0200
290 +@@ -2,9 +2,9 @@
291 + PCS_EXEC = '@SBINDIR@/pcs'
292 + PCS_INTERNAL_EXEC = '@LIB_DIR@/pcs/pcs_internal'
293 + PCSD_EXEC_LOCATION = '@LIB_DIR@/pcsd'
294 +-PCSD_VAR_LOCATION = '@LOCALSTATEDIR@/lib/pcsd'
295 ++PCSD_VAR_LOCATION = '/var/lib/pcsd'
296 + PCSD_DEFAULT_PORT = 2224
297 +-PCSD_RUBY_SOCKET = '@LOCALSTATEDIR@/run/pcsd-ruby.socket'
298 ++PCSD_RUBY_SOCKET = '/var/run/pcsd.socket'
299 +
300 + CRT_FILE = File.join(PCSD_VAR_LOCATION, 'pcsd.crt')
301 + KEY_FILE = File.join(PCSD_VAR_LOCATION, 'pcsd.key')
302 +diff -uPNr pcs-0.11.2/pcs_test/Makefile.am pcs-0.11.2-openrc/pcs_test/Makefile.am
303 +--- pcs-0.11.2/pcs_test/Makefile.am 2022-02-03 13:37:44.000000000 +0100
304 ++++ pcs-0.11.2-openrc/pcs_test/Makefile.am 2022-04-01 20:23:35.837945885 +0200
305 +@@ -101,6 +101,7 @@
306 + tier0/common/services/drivers/__init__.py \
307 + tier0/common/services/drivers/test_systemd.py \
308 + tier0/common/services/drivers/test_sysvinit_rhel.py \
309 ++ tier0/common/services/drivers/test_openrc_gentoo.py \
310 + tier0/common/services/__init__.py \
311 + tier0/common/test_file.py \
312 + tier0/common/test_host.py \
313 +diff -uPNr pcs-0.11.2/pcs_test/tier0/common/services/drivers/test_openrc_gentoo.py pcs-0.11.2-openrc/pcs_test/tier0/common/services/drivers/test_openrc_gentoo.py
314 +--- pcs-0.11.2/pcs_test/tier0/common/services/drivers/test_openrc_gentoo.py 1970-01-01 01:00:00.000000000 +0100
315 ++++ pcs-0.11.2-openrc/pcs_test/tier0/common/services/drivers/test_openrc_gentoo.py 2022-04-01 20:29:57.272257820 +0200
316 +@@ -0,0 +1,232 @@
317 ++from unittest import mock, TestCase
318 ++
319 ++
320 ++from pcs.common.services import errors
321 ++from pcs.common.services.drivers import OpenRCGentooDriver
322 ++from pcs.common.services.interfaces import ExecutorInterface
323 ++from pcs.common.services.types import ExecutorResult
324 ++
325 ++
326 ++class Base(TestCase):
327 ++ def setUp(self):
328 ++ self.mock_executor = mock.MagicMock(spec_set=ExecutorInterface)
329 ++ self.service = "service_name"
330 ++ self.instance = "instance_name"
331 ++ self.rc_service_bin = "rc_service_bin"
332 ++ self.rc_config_bin = "rc_config_bin"
333 ++ self.driver = OpenRCGentooDriver(
334 ++ self.mock_executor, self.rc_service_bin, self.rc_config_bin
335 ++ )
336 ++
337 ++
338 ++class BaseTestMixin:
339 ++ subcmd = None
340 ++ exception = None
341 ++ executable = None
342 ++ driver_callback = staticmethod(lambda: None)
343 ++
344 ++ def test_success(self):
345 ++ self.mock_executor.run.return_value = ExecutorResult(0, "", "")
346 ++ self.driver_callback(self.service)
347 ++ self.mock_executor.run.assert_called_once_with(
348 ++ [self.executable, self.service, self.subcmd]
349 ++ )
350 ++
351 ++ def test_instance_success(self):
352 ++ self.mock_executor.run.return_value = ExecutorResult(0, "", "")
353 ++ self.driver_callback(self.service, self.instance)
354 ++ self.mock_executor.run.assert_called_once_with(
355 ++ [self.executable, self.service, self.subcmd]
356 ++ )
357 ++
358 ++ def test_failure(self):
359 ++ result = ExecutorResult(1, "stdout", "stderr")
360 ++ self.mock_executor.run.return_value = result
361 ++ with self.assertRaises(self.exception) as cm:
362 ++ self.driver_callback(self.service)
363 ++
364 ++ self.assertEqual(cm.exception.service, self.service)
365 ++ self.assertEqual(cm.exception.message, result.joined_output)
366 ++ self.assertIsNone(cm.exception.instance)
367 ++ self.mock_executor.run.assert_called_once_with(
368 ++ [self.executable, self.service, self.subcmd]
369 ++ )
370 ++
371 ++ def test_instace_failure(self):
372 ++ result = ExecutorResult(1, "stdout", "stderr")
373 ++ self.mock_executor.run.return_value = result
374 ++ with self.assertRaises(self.exception) as cm:
375 ++ self.driver_callback(self.service, self.instance)
376 ++
377 ++ self.assertEqual(cm.exception.service, self.service)
378 ++ self.assertEqual(cm.exception.message, result.joined_output)
379 ++ self.assertIsNone(cm.exception.instance)
380 ++ self.mock_executor.run.assert_called_once_with(
381 ++ [self.executable, self.service, self.subcmd]
382 ++ )
383 ++
384 ++
385 ++class StartTest(Base, BaseTestMixin):
386 ++ subcmd = "start"
387 ++ exception = errors.StartServiceError
388 ++
389 ++ def setUp(self):
390 ++ super().setUp()
391 ++ self.driver_callback = self.driver.start
392 ++ self.executable = self.rc_service_bin
393 ++
394 ++
395 ++class StopTest(Base, BaseTestMixin):
396 ++ subcmd = "stop"
397 ++ exception = errors.StopServiceError
398 ++
399 ++ def setUp(self):
400 ++ super().setUp()
401 ++ self.driver_callback = self.driver.stop
402 ++ self.executable = self.service_bin
403 ++
404 ++
405 ++class EnableTest(Base, BaseTestMixin):
406 ++ subcmd = "on"
407 ++ exception = errors.EnableServiceError
408 ++
409 ++ def setUp(self):
410 ++ super().setUp()
411 ++ self.driver_callback = self.driver.enable
412 ++ self.executable = self.rc_config_bin
413 ++
414 ++
415 ++class DisableTest(Base, BaseTestMixin):
416 ++ subcmd = "off"
417 ++ exception = errors.DisableServiceError
418 ++
419 ++ def setUp(self):
420 ++ super().setUp()
421 ++ # pylint: disable=protected-access
422 ++ self.driver._available_services = [self.service]
423 ++ self.driver_callback = self.driver.disable
424 ++ self.executable = self.rc_config_bin
425 ++
426 ++ def test_not_intalled(self):
427 ++ # pylint: disable=protected-access
428 ++ self.driver._available_services = [f"not_{self.service}"]
429 ++ self.driver_callback(self.service)
430 ++ self.mock_executor.run.assert_not_called()
431 ++
432 ++
433 ++class IsEnabledTest(Base):
434 ++ def test_enabled(self):
435 ++ self.mock_executor.run.return_value = ExecutorResult(0, "", "")
436 ++ self.assertTrue(self.driver.is_enabled(self.service))
437 ++ self.mock_executor.run.assert_called_once_with(
438 ++ [self.rc_config_bin, self.service]
439 ++ )
440 ++
441 ++ def test_instance_enabled(self):
442 ++ self.mock_executor.run.return_value = ExecutorResult(0, "", "")
443 ++ self.assertTrue(self.driver.is_enabled(self.service, self.instance))
444 ++ self.mock_executor.run.assert_called_once_with(
445 ++ [self.rc_config_bin, self.service]
446 ++ )
447 ++
448 ++ def test_disabled(self):
449 ++ self.mock_executor.run.return_value = ExecutorResult(3, "", "")
450 ++ self.assertFalse(self.driver.is_enabled(self.service))
451 ++ self.mock_executor.run.assert_called_once_with(
452 ++ [self.rc_config_bin, self.service]
453 ++ )
454 ++
455 ++ def test_failure(self):
456 ++ self.mock_executor.run.return_value = ExecutorResult(1, "", "")
457 ++ self.assertFalse(self.driver.is_enabled(self.service))
458 ++ self.mock_executor.run.assert_called_once_with(
459 ++ [self.rc_config_bin, self.service]
460 ++ )
461 ++
462 ++
463 ++class IsRunningTest(Base):
464 ++ def test_running(self):
465 ++ self.mock_executor.run.return_value = ExecutorResult(
466 ++ 0, " * status: started", ""
467 ++ )
468 ++ self.assertTrue(self.driver.is_running(self.service))
469 ++ self.mock_executor.run.assert_called_once_with(
470 ++ [self.rc_service_bin, self.service, "status"]
471 ++ )
472 ++
473 ++ def test_instance_running(self):
474 ++ self.mock_executor.run.return_value = ExecutorResult(
475 ++ 0, " * status: started", ""
476 ++ )
477 ++ self.assertTrue(self.driver.is_running(self.service, self.instance))
478 ++ self.mock_executor.run.assert_called_once_with(
479 ++ [self.rc_service_bin, self.service, "status"]
480 ++ )
481 ++
482 ++ def test_not_running(self):
483 ++ self.mock_executor.run.return_value = ExecutorResult(
484 ++ 0, " * status: stopped", ""
485 ++ )
486 ++ self.assertFalse(self.driver.is_running(self.service))
487 ++ self.mock_executor.run.assert_called_once_with(
488 ++ [self.rc_service_bin, self.service, "status"]
489 ++ )
490 ++
491 ++ def test_failure(self):
492 ++ self.mock_executor.run.return_value = ExecutorResult(1, "", "error")
493 ++ self.assertFalse(self.driver.is_running(self.service))
494 ++ self.mock_executor.run.assert_called_once_with(
495 ++ [self.rc_service_bin, self.service, "status"]
496 ++ )
497 ++
498 ++
499 ++class IsInstalledTest(Base):
500 ++ def test_installed(self):
501 ++ output = (
502 ++ "Init scripts to be started by runlevel default\n"
503 ++ " service1\n"
504 ++ " abc\n"
505 ++ " xyz\n"
506 ++ f" {self.service}\n"
507 ++ )
508 ++ self.mock_executor.run.return_value = ExecutorResult(0, output, "")
509 ++ self.assertTrue(self.driver.is_installed(self.service))
510 ++ # Intentionally called twice to make sure that unit files listing is
511 ++ # done only once
512 ++ self.assertTrue(self.driver.is_installed(self.service))
513 ++ self.mock_executor.run.assert_called_once_with([self.rc_config_bin])
514 ++
515 ++ def test_not_installed(self):
516 ++ output = (
517 ++ "Init scripts to be started by runlevel default\n"
518 ++ " service1\n"
519 ++ " abc\n"
520 ++ " xyz\n"
521 ++ )
522 ++ self.mock_executor.run.return_value = ExecutorResult(0, output, "")
523 ++ self.assertFalse(self.driver.is_installed(self.service))
524 ++ # Intentionally called twice to make sure that unit files listing is
525 ++ # done only once
526 ++ self.assertFalse(self.driver.is_installed(self.service))
527 ++ self.mock_executor.run.assert_called_once_with([self.rc_config_bin])
528 ++
529 ++
530 ++class GetAvailableServicesTest(Base):
531 ++ def test_success(self):
532 ++ output = (
533 ++ "Init scripts to be started by runlevel default\n"
534 ++ " service1\n"
535 ++ " abc\n"
536 ++ " xyz\n"
537 ++ )
538 ++ self.mock_executor.run.return_value = ExecutorResult(0, output, "")
539 ++ self.assertEqual(
540 ++ self.driver.get_available_services(),
541 ++ ["service1", "abc", "xyz"],
542 ++ )
543 ++ self.mock_executor.run.assert_called_once_with([self.rc_config_bin])
544 ++
545 ++ def test_failure(self):
546 ++ self.mock_executor.run.return_value = ExecutorResult(1, "", "error")
547 ++ self.assertEqual(self.driver.get_available_services(), [])
548 ++ self.mock_executor.run.assert_called_once_with([self.rc_config_bin])
549
550 diff --git a/sys-cluster/pcs/files/pcs-0.11.initd b/sys-cluster/pcs/files/pcs-0.11.initd
551 new file mode 100644
552 index 000000000..62ed7cccd
553 --- /dev/null
554 +++ b/sys-cluster/pcs/files/pcs-0.11.initd
555 @@ -0,0 +1,35 @@
556 +#!/sbin/openrc-run
557 +# Copyright 2019-2020 Gentoo Authors
558 +# Distributed under the terms of the GNU General Public License v2
559 +
560 +name="pcs"
561 +description="Pacemaker & Corosync configuration daemon"
562 +command=/usr/sbin/pcs
563 +command_args="${pcsd_args}"
564 +
565 +PIDFILE=/var/run/$name.pid
566 +
567 +# load defaults
568 +if [ -f /etc/default/pcsd ]; then source /etc/default/pcsd; fi
569 +
570 +depend() {
571 + need net pcsd-daemon
572 + use syslog
573 +}
574 +
575 +start() {
576 + nc=0
577 + ebegin "Starting $description"
578 +
579 + mkdir -p /var/run
580 +
581 + start-stop-daemon --start -q --exec $command $command_args \
582 + --pidfile "${PIDFILE}" --make-pidfile --background
583 + eend $?
584 +}
585 +
586 +stop() {
587 + ebegin "Stopping $description"
588 + start-stop-daemon --stop -q --pidfile "${PIDFILE}"
589 + eend $?
590 +}
591
592 diff --git a/sys-cluster/pcs/files/pcsd-0.11.initd b/sys-cluster/pcs/files/pcsd-0.11.initd
593 new file mode 100644
594 index 000000000..da144d8e0
595 --- /dev/null
596 +++ b/sys-cluster/pcs/files/pcsd-0.11.initd
597 @@ -0,0 +1,27 @@
598 +#!/sbin/openrc-run
599 +# Copyright 2019-2020 Gentoo Authors
600 +# Distributed under the terms of the GNU General Public License v2
601 +
602 +name="pcsd"
603 +description="PCS GUI and remote configuration interface (Ruby)"
604 +command=/usr/sbin/pcsd
605 +command_args="${pcsd_args}"
606 +
607 +PIDFILE=/var/run/$name.pid
608 +
609 +start() {
610 + nc=0
611 + ebegin "Starting $description"
612 +
613 + mkdir -p /var/run
614 +
615 + start-stop-daemon --start -q --exec $command $command_args \
616 + --pidfile "${PIDFILE}" --make-pidfile --background
617 + eend $?
618 +}
619 +
620 +stop() {
621 + ebegin "Stopping $description"
622 + start-stop-daemon --stop -q --pidfile "${PIDFILE}"
623 + eend $?
624 +}
625
626 diff --git a/sys-cluster/pcs/pcs-0.11.2.ebuild b/sys-cluster/pcs/pcs-0.11.2.ebuild
627 new file mode 100644
628 index 000000000..7cdce0605
629 --- /dev/null
630 +++ b/sys-cluster/pcs/pcs-0.11.2.ebuild
631 @@ -0,0 +1,110 @@
632 +# Copyright 1999-2022 Gentoo Authors
633 +# Distributed under the terms of the GNU General Public License v2
634 +
635 +EAPI=8
636 +
637 +DISTUTILS_USE_SETUPTOOLS=rdepend
638 +PYTHON_COMPAT=( python3_{9..10} )
639 +USE_RUBY="ruby27 ruby30 ruby31"
640 +
641 +inherit autotools systemd python-single-r1 ruby-ng
642 +
643 +DESCRIPTION="Pacemaker/Corosync Configuration System"
644 +HOMEPAGE="https://github.com/ClusterLabs/pcs"
645 +SRC_URI="https://github.com/ClusterLabs/pcs/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz"
646 +S="${WORKDIR}/all/${P}"
647 +
648 +LICENSE="GPL-2"
649 +KEYWORDS="~amd64"
650 +IUSE="systemd"
651 +SLOT=0
652 +
653 +DEPEND="
654 + dev-libs/libffi
655 + sys-apps/coreutils
656 +"
657 +RDEPEND="
658 + ${DEPEND}
659 + ${PYTHON_DEPS}
660 + $(python_gen_cond_dep '
661 + dev-python/dacite[${PYTHON_USEDEP}]
662 + dev-python/lxml[${PYTHON_USEDEP}]
663 + dev-python/pycurl[${PYTHON_USEDEP}]
664 + dev-python/pyparsing[${PYTHON_USEDEP}]
665 + dev-python/python-dateutil[${PYTHON_USEDEP}]
666 + >=www-servers/tornado-6.0[${PYTHON_USEDEP}]
667 + <www-servers/tornado-7.0[${PYTHON_USEDEP}]
668 + dev-python/pyagentx[${PYTHON_USEDEP}]
669 + dev-python/cryptography[${PYTHON_USEDEP}]
670 + dev-python/setuptools[${PYTHON_USEDEP}]
671 + dev-python/setuptools_scm[${PYTHON_USEDEP}]
672 + dev-python/pip[${PYTHON_USEDEP}]
673 + dev-python/python-dateutil[${PYTHON_USEDEP}]
674 + ')
675 + >=sys-cluster/corosync-3.0
676 + >=sys-cluster/pacemaker-2.1.0
677 + sys-libs/pam
678 + sys-process/psmisc
679 +"
680 +
681 +ruby_add_rdepend "
682 + dev-ruby/bundler
683 + dev-ruby/rubygems
684 + dev-ruby/backports
685 + dev-ruby/power_assert
686 + dev-ruby/daemons
687 + dev-ruby/ethon
688 + dev-ruby/eventmachine
689 + dev-ruby/mustermann
690 + dev-ruby/open4
691 + dev-ruby/rack
692 + dev-ruby/rack-protection
693 + dev-ruby/rack-test
694 + dev-ruby/sinatra
695 + www-servers/thin"
696 +
697 +REQUIRED_USE="${PYTHON_REQUIRED_USE}"
698 +PATCHES="${FILESDIR}/pcs-0.11-gentoo-support.patch"
699 +
700 +src_prepare() {
701 + default
702 + eautoreconf
703 +}
704 +
705 +src_configure() {
706 + econf
707 +}
708 +
709 +src_compile() {
710 + return
711 +}
712 +
713 +src_install() {
714 + python-single-r1_pkg_setup
715 +
716 + local makeopts=(
717 + DESTDIR="${D}"
718 + )
719 +
720 + emake install "${makeopts[@]}"
721 +
722 + # mark log directories to be kept
723 + keepdir /var/log/pcsd
724 + keepdir /var/lib/pcsd
725 +
726 + #fix statedir
727 + sed -i ${D}/usr/share/pcsd/pcsd -e 's/\/var\/lib\/lib\//\/var\/lib\//g'
728 +
729 + # custom service file for openRC
730 + if ! use systemd ; then
731 + newinitd "${FILESDIR}/pcs-0.11.initd" pcs
732 + newinitd "${FILESDIR}/pcsd-0.11.initd" pcsd
733 + fi
734 +
735 + if use systemd ; then
736 + systemd_newunit "${S}/pcsd/pcsd.service.in" "pcs.service"
737 + systemd_newunit "${S}/pcsd/pcsd-ruby.service.in" "pcsd.service"
738 + fi
739 +
740 + python_optimize
741 +}