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 |
+} |