import pcs-0.12.0~b1-1.el10

i10cs changed/i10cs/pcs-0.12.0%7eb1-1.el10
MSVSphere Packaging Team 3 months ago
parent 84540e386f
commit 3b6f4c0599
Signed by: sys_gitsync
GPG Key ID: B2B0B9F29E528FE8

23
.gitignore vendored

@ -3,22 +3,19 @@ SOURCES/base64-0.2.0.gem
SOURCES/childprocess-5.0.0.gem
SOURCES/dacite-1.8.1.tar.gz
SOURCES/ethon-0.16.0.gem
SOURCES/ffi-1.16.3.gem
SOURCES/mustermann-3.0.0.gem
SOURCES/nio4r-2.7.3.gem
SOURCES/pcs-0.12.0a1.tar.gz
SOURCES/pcs-web-ui-0.1.20.tar.gz
SOURCES/pcs-web-ui-node-modules-0.1.20.tar.xz
SOURCES/puma-6.4.2.gem
SOURCES/ffi-1.17.0.gem
SOURCES/mustermann-3.0.3.gem
SOURCES/nio4r-2.7.4.gem
SOURCES/pcs-0.12.0b1.tar.gz
SOURCES/pcs-web-ui-0.1.21.tar.gz
SOURCES/pcs-web-ui-node-modules-0.1.21.tar.xz
SOURCES/puma-6.4.3.gem
SOURCES/pyagentx-0.4.pcs.2.tar.gz
SOURCES/pycurl-7.45.3.tar.gz
SOURCES/rack-3.0.11.gem
SOURCES/rack-3.1.8.gem
SOURCES/rack-protection-4.0.0.gem
SOURCES/rack-session-2.0.0.gem
SOURCES/rack-test-2.1.0.gem
SOURCES/rackup-2.1.0.gem
SOURCES/ruby2_keywords-0.0.5.gem
SOURCES/rackup-2.2.1.gem
SOURCES/sinatra-4.0.0.gem
SOURCES/tilt-2.3.0.gem
SOURCES/tornado-6.4.0.tar.gz
SOURCES/webrick-1.8.1.gem
SOURCES/tilt-2.4.0.gem

@ -3,22 +3,19 @@ ea3a591bdfa93655d8eec9d7bdd7fb87ecb5616a SOURCES/base64-0.2.0.gem
8f910640f84d085707138aa70d6eedb7df10ca73 SOURCES/childprocess-5.0.0.gem
07b26abbf7ff0dcba5c7f9e814ff7eebafefb058 SOURCES/dacite-1.8.1.tar.gz
5b56a68268708c474bef04550639ded3add5e946 SOURCES/ethon-0.16.0.gem
10e4cf0e11ef4581ec4ad5fe2cdf3c78b6077d39 SOURCES/ffi-1.16.3.gem
e892678aaf02ccb27f3a6cd58482cda00aea6ce8 SOURCES/mustermann-3.0.0.gem
632c455f6e27a5f568e9d24761b8a4246cfcc603 SOURCES/nio4r-2.7.3.gem
85dccd75ffe486aff1c3c5ce4448b3da7bae6919 SOURCES/pcs-0.12.0a1.tar.gz
c75288254b282cb8aed7307fd18dbdd8dda9252d SOURCES/pcs-web-ui-0.1.20.tar.gz
1dbe81ac08cfe60da25cc8650292cdc7c33cdb89 SOURCES/pcs-web-ui-node-modules-0.1.20.tar.xz
623cb3ebec75de449cad3c9f50d5d370edf9e2f9 SOURCES/puma-6.4.2.gem
8edfdd7cc314b5dc84851ea05b6fceedadf386a1 SOURCES/ffi-1.17.0.gem
249a573022dde130372f0ebbeaf2430f36c2b664 SOURCES/mustermann-3.0.3.gem
34b5b1cb50f18d6ec6c5d5cbcb823e7f81f54290 SOURCES/nio4r-2.7.4.gem
188cea0a72ea4804e277c8a7fdbed02a9d28808e SOURCES/pcs-0.12.0b1.tar.gz
a0d519196474b8768129569ba14b459cf4732945 SOURCES/pcs-web-ui-0.1.21.tar.gz
73838169577c2ec6c1dae9bf6b0c371cc7c12020 SOURCES/pcs-web-ui-node-modules-0.1.21.tar.xz
f72357acbdcfd68b4b41a999ed47926c0e54ea5e SOURCES/puma-6.4.3.gem
3176b2f2b332c2b6bf79fe882e83feecf3d3f011 SOURCES/pyagentx-0.4.pcs.2.tar.gz
d36e54b3d6d36460dae0c7a2b9971d72d16d8225 SOURCES/pycurl-7.45.3.tar.gz
a156440aaee17f60b83f2f681ec60fce2329a480 SOURCES/rack-3.0.11.gem
a7f73594003243ebf00f8cb2716665a054b378b4 SOURCES/rack-3.1.8.gem
f91158b296882aa5b3798ff6c24f01cdf233ef48 SOURCES/rack-protection-4.0.0.gem
9e7935696af0b64cc5f5ce2dfeabdb7e0d3a84f0 SOURCES/rack-session-2.0.0.gem
ae09ea83748b55875edc3708fffba90db180cb8e SOURCES/rack-test-2.1.0.gem
657a2dc63695e1bf9eb5feae4d9d65a7c6b900ad SOURCES/rackup-2.1.0.gem
d017b9e4d1978e0b3ccc3e2a31493809e4693cd3 SOURCES/ruby2_keywords-0.0.5.gem
efa414fe946ccc1f70e64337d206e98807baa717 SOURCES/rackup-2.2.1.gem
28c671c6d061475ed2bfd3e6a4a17970a0a12d8a SOURCES/sinatra-4.0.0.gem
4a38a9a55887b2882182a2c5771e592efe514e5e SOURCES/tilt-2.3.0.gem
ee95560139af1bb8d0d49d4acf0518deb04877d2 SOURCES/tornado-6.4.0.tar.gz
0696afa9cc0b56f541aacb7483aecdb385a5bd37 SOURCES/webrick-1.8.1.gem
ad6225a8c3b4b66f88ae878d76ef6dec1d0c2f9e SOURCES/tilt-2.4.0.gem

@ -1,444 +0,0 @@
From 525b102bd053a6653dff663845c98683fa78bbab Mon Sep 17 00:00:00 2001
From: Ivan Devat <idevat@redhat.com>
Date: Mon, 24 Jun 2024 17:19:58 +0200
Subject: [PATCH] fix tests for missing webui
---
pcs_test/Makefile.am | 1 +
pcs_test/smoke.sh.in | 23 ++++++--
pcs_test/tier0/daemon/app/fixtures_app.py | 53 +++----------------
.../tier0/daemon/app/fixtures_app_webui.py | 28 ++++++++++
pcs_test/tier0/daemon/app/test_app_gui.py | 37 ++++++++++---
pcs_test/tier0/daemon/app/test_app_spa.py | 26 +++++++--
pcs_test/tier0/daemon/test_env.py | 6 ++-
pcs_test/tier0/daemon/test_session.py | 25 ++++++---
pcs_test/tools/misc.py | 9 ++++
9 files changed, 138 insertions(+), 70 deletions(-)
create mode 100644 pcs_test/tier0/daemon/app/fixtures_app_webui.py
diff --git a/pcs_test/Makefile.am b/pcs_test/Makefile.am
index 4e71fcda..6c5932b3 100644
--- a/pcs_test/Makefile.am
+++ b/pcs_test/Makefile.am
@@ -134,6 +134,7 @@ EXTRA_DIST = \
tier0/common/test_tools.py \
tier0/common/test_tools_xml_fromstring.py \
tier0/daemon/app/fixtures_app.py \
+ tier0/daemon/app/fixtures_app_webui.py \
tier0/daemon/app/__init__.py \
tier0/daemon/app/test_api_v0.py \
tier0/daemon/app/test_api_v1.py \
diff --git a/pcs_test/smoke.sh.in b/pcs_test/smoke.sh.in
index a4b3ac71..37eac345 100755
--- a/pcs_test/smoke.sh.in
+++ b/pcs_test/smoke.sh.in
@@ -66,10 +66,25 @@ cat <<EOF > ${pcsd_settings_conf_path}
EOF
cat ${pcsd_settings_conf_path}
pcs cluster start --all --wait
-curl --insecure --data "username=${cluster_user}&password=${cluster_user_password}" --cookie-jar ${cookie_file} https://localhost:2224/ui/login
-curl --insecure --cookie ${cookie_file} --header "X-Requested-With: XMLHttpRequest" --data "hidden[hidden_input]=&config[stonith-enabled]=false" https://localhost:2224/managec/${cluster_name}/update_cluster_settings > "${output_file}"
-cat "${output_file}"; echo ""
-[ "$(cat ${output_file})" = "Update Successful" ]
+
+webui_http_code_response=$(
+ curl --insecure --silent --output /dev/null --write-out "%{http_code}" \
+ https://localhost:2224/ui/
+)
+if [ "$webui_http_code_response" = "200" ]; then
+ # Webui backend check
+ curl --insecure --data "username=${cluster_user}&password=${cluster_user_password}" --cookie-jar ${cookie_file} https://localhost:2224/ui/login
+ curl --insecure --cookie ${cookie_file} --header "X-Requested-With: XMLHttpRequest" --data "hidden[hidden_input]=&config[stonith-enabled]=false" https://localhost:2224/managec/${cluster_name}/update_cluster_settings > "${output_file}"
+ cat "${output_file}"; echo ""
+ [ "$(cat ${output_file})" = "Update Successful" ]
+elif [ "$webui_http_code_response" = "401" ]; then
+ curl --insecure https://localhost:2224/ui/ > "${output_file}"
+ cat "${output_file}"; echo ""
+ [ "$(cat "${output_file}")" = '{"notauthorized":"true"}' ]
+else
+ echo "Unexpected response from https://localhost:2224/ui/ - http code: '${webui_http_code_response}'"
+ exit 1
+fi
# Sanity check of API V1
curl -kb "token=${token}" https://localhost:2224/api/v1/resource-agent-get-agents-list/v1 --data '{}' > "${output_file}"
diff --git a/pcs_test/tier0/daemon/app/fixtures_app.py b/pcs_test/tier0/daemon/app/fixtures_app.py
index 3c0d6a4f..56acf473 100644
--- a/pcs_test/tier0/daemon/app/fixtures_app.py
+++ b/pcs_test/tier0/daemon/app/fixtures_app.py
@@ -1,16 +1,11 @@
from pprint import pformat
from urllib.parse import urlencode
-from tornado.httputil import (
- HTTPHeaders,
- parse_cookie,
-)
+from tornado.httputil import HTTPHeaders
from tornado.testing import AsyncHTTPTestCase
from tornado.web import Application
from pcs.daemon import ruby_pcsd
-from pcs.daemon.app.webui import session
-from pcs.daemon.app.webui.auth import PCSD_SESSION
USER = "user"
GROUPS = ["group1", "group2"]
@@ -56,6 +51,13 @@ class AppTest(AsyncHTTPTestCase):
def fetch(self, path, raise_error=False, **kwargs):
if "follow_redirects" not in kwargs:
kwargs["follow_redirects"] = False
+
+ if "is_ajax" in kwargs:
+ if "headers" not in kwargs:
+ kwargs["headers"] = {}
+ kwargs["headers"]["X-Requested-With"] = "XMLHttpRequest"
+ del kwargs["is_ajax"]
+
response = super().fetch(path, raise_error=raise_error, **kwargs)
# "Strict-Transport-Security" header is expected in every response
self.assertTrue(
@@ -91,45 +93,6 @@ class AppTest(AsyncHTTPTestCase):
self.assert_headers_contains(response.headers, self.wrapper.headers)
self.assertEqual(response.body, self.wrapper.body)
-
-class AppUiTestMixin(AppTest):
- def setUp(self):
- self.session_storage = session.Storage(lifetime_seconds=10)
- super().setUp()
-
- def assert_session_in_response(self, response, sid=None):
- self.assertTrue("Set-Cookie" in response.headers)
- cookie = parse_cookie(response.headers["Set-Cookie"])
- self.assertTrue(PCSD_SESSION, cookie)
- if sid:
- self.assertEqual(cookie[PCSD_SESSION], sid)
- return cookie[PCSD_SESSION]
-
- def fetch(self, path, raise_error=False, **kwargs):
- if "sid" in kwargs:
- if "headers" not in kwargs:
- kwargs["headers"] = {}
- kwargs["headers"]["Cookie"] = f"{PCSD_SESSION}={kwargs['sid']}"
- del kwargs["sid"]
-
- if "is_ajax" in kwargs:
- if "headers" not in kwargs:
- kwargs["headers"] = {}
- kwargs["headers"]["X-Requested-With"] = "XMLHttpRequest"
- del kwargs["is_ajax"]
-
- if "follow_redirects" not in kwargs:
- kwargs["follow_redirects"] = False
-
- return super().fetch(path, raise_error=raise_error, **kwargs)
-
- def create_login_session(self):
- return self.session_storage.login(USER)
-
- def assert_success_response(self, response, expected_body):
- self.assertEqual(response.code, 200)
- self.assertEqual(response.body.decode(), expected_body)
-
def assert_unauth_ajax(self, response):
self.assertEqual(response.code, 401)
self.assertEqual(response.body, b'{"notauthorized":"true"}')
diff --git a/pcs_test/tier0/daemon/app/fixtures_app_webui.py b/pcs_test/tier0/daemon/app/fixtures_app_webui.py
new file mode 100644
index 00000000..e38ca3e7
--- /dev/null
+++ b/pcs_test/tier0/daemon/app/fixtures_app_webui.py
@@ -0,0 +1,28 @@
+try:
+ from pcs.daemon.app import webui
+except ImportError:
+ # You need to skip tests in tests that uses AppTest in the case webui
+ # is not there.
+ webui = None
+
+from pcs_test.tier0.daemon.app import fixtures_app
+
+
+class AppTest(fixtures_app.AppTest):
+ def setUp(self):
+ self.session_storage = webui.session.Storage(lifetime_seconds=10)
+ super().setUp()
+
+ def fetch(self, path, raise_error=False, **kwargs):
+ if "sid" in kwargs:
+ if "headers" not in kwargs:
+ kwargs["headers"] = {}
+ kwargs["headers"][
+ "Cookie"
+ ] = f"{webui.auth.PCSD_SESSION}={kwargs['sid']}"
+ del kwargs["sid"]
+
+ return super().fetch(path, raise_error=raise_error, **kwargs)
+
+ def create_login_session(self):
+ return self.session_storage.login(fixtures_app.USER)
diff --git a/pcs_test/tier0/daemon/app/test_app_gui.py b/pcs_test/tier0/daemon/app/test_app_gui.py
index b3446fdb..2317eea5 100644
--- a/pcs_test/tier0/daemon/app/test_app_gui.py
+++ b/pcs_test/tier0/daemon/app/test_app_gui.py
@@ -1,14 +1,24 @@
import logging
from unittest import mock
+from tornado.httputil import parse_cookie
+
from pcs.daemon import ruby_pcsd
from pcs.daemon.app import sinatra_ui
from pcs.daemon.app.auth import UnixSocketAuthProvider
-from pcs.daemon.app.webui import sinatra_ui as sinatra_ui_webui
+
+try:
+ from pcs.daemon.app import webui
+except ImportError:
+ webui = None
from pcs.lib.auth.provider import AuthProvider
from pcs.lib.auth.types import AuthUser
-from pcs_test.tier0.daemon.app import fixtures_app
+from pcs_test.tier0.daemon.app import (
+ fixtures_app,
+ fixtures_app_webui,
+)
+from pcs_test.tools.misc import skip_unless_webui_installed
# Don't write errors to test output.
logging.getLogger("tornado.access").setLevel(logging.CRITICAL)
@@ -33,21 +43,28 @@ def patch_get_unix_socket_user(user):
auth_provider = AuthProvider(logging.getLogger("test logger"))
-class AppTest(fixtures_app.AppUiTestMixin):
+@skip_unless_webui_installed()
+@patch_login_user()
+class SinatraAjaxProtectedSession(fixtures_app_webui.AppTest):
def setUp(self):
self.wrapper = fixtures_app.RubyPcsdWrapper(ruby_pcsd.SINATRA)
super().setUp()
-
-@patch_login_user()
-class SinatraAjaxProtectedSession(AppTest):
def get_routes(self):
- return sinatra_ui_webui.get_routes(
+ return webui.sinatra_ui.get_routes(
self.session_storage,
auth_provider,
self.wrapper,
)
+ def assert_session_in_response(self, response, sid=None):
+ self.assertTrue("Set-Cookie" in response.headers)
+ cookie = parse_cookie(response.headers["Set-Cookie"])
+ self.assertTrue(webui.auth.PCSD_SESSION, cookie)
+ if sid:
+ self.assertEqual(cookie[webui.auth.PCSD_SESSION], sid)
+ return cookie[webui.auth.PCSD_SESSION]
+
def test_deal_without_authentication(self):
self.assert_unauth_ajax(self.get("/some-ajax", is_ajax=True))
@@ -63,7 +80,11 @@ class SinatraAjaxProtectedSession(AppTest):
@patch_login_user()
-class SinatraAjaxProtectedUnixSocket(AppTest):
+class SinatraAjaxProtectedUnixSocket(fixtures_app.AppTest):
+ def setUp(self):
+ self.wrapper = fixtures_app.RubyPcsdWrapper(ruby_pcsd.SINATRA)
+ super().setUp()
+
def get_routes(self):
return sinatra_ui.get_routes(auth_provider, self.wrapper)
diff --git a/pcs_test/tier0/daemon/app/test_app_spa.py b/pcs_test/tier0/daemon/app/test_app_spa.py
index 89a5ab0e..6acf3c7d 100644
--- a/pcs_test/tier0/daemon/app/test_app_spa.py
+++ b/pcs_test/tier0/daemon/app/test_app_spa.py
@@ -2,12 +2,22 @@ import logging
import os
from unittest import mock
-from pcs.daemon.app import webui
+try:
+ from pcs.daemon.app import webui
+except ImportError:
+ webui = None
+
from pcs.lib.auth.provider import AuthProvider
from pcs.lib.auth.types import AuthUser
-from pcs_test.tier0.daemon.app import fixtures_app
-from pcs_test.tools.misc import get_tmp_dir
+from pcs_test.tier0.daemon.app import (
+ fixtures_app,
+ fixtures_app_webui,
+)
+from pcs_test.tools.misc import (
+ get_tmp_dir,
+ skip_unless_webui_installed,
+)
LOGIN_BODY = {"username": fixtures_app.USER, "password": fixtures_app.PASSWORD}
PREFIX = "/ui/"
@@ -16,7 +26,7 @@ PREFIX = "/ui/"
logging.getLogger("tornado.access").setLevel(logging.CRITICAL)
-class AppTest(fixtures_app.AppUiTestMixin):
+class AppTest(fixtures_app_webui.AppTest):
def setUp(self):
self.public_dir = get_tmp_dir("tier0_daemon_app_spa")
self.spa_dir_path = os.path.join(self.public_dir.name, "ui")
@@ -41,7 +51,12 @@ class AppTest(fixtures_app.AppUiTestMixin):
auth_provider=AuthProvider(logging.Logger("test logger")),
)
+ def assert_success_response(self, response, expected_body):
+ self.assertEqual(response.code, 200)
+ self.assertEqual(response.body.decode(), expected_body)
+
+@skip_unless_webui_installed()
class Static(AppTest):
def test_index(self):
self.assert_success_response(
@@ -50,6 +65,7 @@ class Static(AppTest):
)
+@skip_unless_webui_installed()
class Fallback(AppTest):
def setUp(self):
super().setUp()
@@ -65,6 +81,7 @@ class Fallback(AppTest):
)
+@skip_unless_webui_installed()
class Login(AppTest):
def setUp(self):
super().setUp()
@@ -94,6 +111,7 @@ class Login(AppTest):
)
+@skip_unless_webui_installed()
class Logout(AppTest):
def test_can_logout(self):
session1 = self.create_login_session()
diff --git a/pcs_test/tier0/daemon/test_env.py b/pcs_test/tier0/daemon/test_env.py
index 40f0c402..0eff3660 100644
--- a/pcs_test/tier0/daemon/test_env.py
+++ b/pcs_test/tier0/daemon/test_env.py
@@ -8,7 +8,10 @@ from unittest import (
from pcs import settings
from pcs.daemon import env
-from pcs_test.tools.misc import create_setup_patch_mixin
+from pcs_test.tools.misc import (
+ create_setup_patch_mixin,
+ skip_unless_webui_installed,
+)
def webui_fallback(public_dir):
@@ -177,6 +180,7 @@ class Prepare(TestCase, create_setup_patch_mixin(env)):
{env.PCSD_DEBUG: "false"}
)
+ @skip_unless_webui_installed()
def test_errors_on_missing_paths(self):
self.path_exists.return_value = False
self.assert_environ_produces_modified_pcsd_env(
diff --git a/pcs_test/tier0/daemon/test_session.py b/pcs_test/tier0/daemon/test_session.py
index a893c01d..e8eff4cd 100644
--- a/pcs_test/tier0/daemon/test_session.py
+++ b/pcs_test/tier0/daemon/test_session.py
@@ -1,23 +1,31 @@
from contextlib import contextmanager
from unittest import TestCase
-from pcs.daemon.app.webui import session
-from pcs.daemon.app.webui.session import Session
+try:
+ from pcs.daemon.app import webui
+except ImportError:
+ webui = None
-from pcs_test.tools.misc import create_setup_patch_mixin
+from pcs_test.tools.misc import (
+ create_setup_patch_mixin,
+ skip_unless_webui_installed,
+)
SID = "abc"
USER = "user"
GROUPS = ["group1", "group2"]
-PatchSessionMixin = create_setup_patch_mixin(session)
+# If webui is None, the tests in this file using these mixins are skipped,
+# passing a dummy object instead to make this executable
+PatchSessionMixin = create_setup_patch_mixin(webui) if webui else object
+@skip_unless_webui_installed()
class SessionTest(TestCase, PatchSessionMixin):
def setUp(self):
- self.now = self.setup_patch("now", return_value=0)
- self.session = Session(SID, USER)
+ self.now = self.setup_patch("session.now", return_value=0)
+ self.session = webui.session.Session(SID, USER)
def test_session_grows_older(self):
self.now.return_value = 10.1
@@ -42,10 +50,11 @@ class SessionTest(TestCase, PatchSessionMixin):
session1.sid
+@skip_unless_webui_installed()
class StorageTest(TestCase, PatchSessionMixin):
def setUp(self):
- self.now = self.setup_patch("now", return_value=0)
- self.storage = session.Storage(lifetime_seconds=10)
+ self.now = self.setup_patch("session.now", return_value=0)
+ self.storage = webui.session.Storage(lifetime_seconds=10)
def test_does_not_accept_foreign_sid(self):
self.assertIsNone(self.storage.get("unknown_sid"))
diff --git a/pcs_test/tools/misc.py b/pcs_test/tools/misc.py
index 28e03411..7a048a4d 100644
--- a/pcs_test/tools/misc.py
+++ b/pcs_test/tools/misc.py
@@ -15,6 +15,11 @@ from pcs.cli.common.parse_args import InputModifiers
from pcs.common import str_tools
from pcs.lib.external import CommandRunner
+try:
+ from pcs.daemon.app import webui
+except ImportError:
+ webui = None # type: ignore
+
from pcs_test import TEST_ROOT
from pcs_test import settings as tests_settings
from pcs_test.tools.custom_mock import MockLibraryReportProcessor
@@ -292,6 +297,10 @@ def skip_unless_booth_resource_agent_installed():
)
+def skip_unless_webui_installed():
+ return skipUnless(webui, "test requires webui which is not installed")
+
+
def create_patcher(target_prefix_or_module):
"""
Return function for patching tests with preconfigured target prefix
--
2.45.2

@ -1,18 +1,17 @@
Name: pcs
Version: 0.12.0~a1
Release: 4%{?dist}
Version: 0.12.0~b1
Release: 1%{?dist}
# https://docs.fedoraproject.org/en-US/packaging-guidelines/LicensingGuidelines/
# https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses
# GPL-2.0-only: pcs
# Apache-2.0: tornado
# MIT: backports, childprocess, dacite, ethon, mustermann, rack,
# rack-protection, rack-session, rack-test, rackup, sinatra, tilt
# MIT and (BSD-2-Clause or GPL-2.0-or-later): nio4r
# BSD-2-Clause or Ruby: base64, ruby2_keywords, webrick
# BSD-2-Clause or Ruby: base64
# BSD-3-Clause: puma
# BSD-3-Clause and MIT: ffi
# curl OR LGPL-2.1-or-later: python-pycurl
License: GPL-2.0-only AND Apache-2.0 AND MIT AND BSD-3-Clause AND (BSD-2-Clause OR Ruby) AND (BSD-2-Clause OR GPL-2.0-or-later) AND (curl OR LGPL-2.1-or-later)
License: GPL-2.0-only AND MIT AND BSD-3-Clause AND (BSD-2-Clause OR Ruby) AND (BSD-2-Clause OR GPL-2.0-or-later) AND (curl OR LGPL-2.1-or-later)
URL: https://github.com/ClusterLabs/pcs
Group: System Environment/Base
Summary: Pacemaker/Corosync Configuration System
@ -27,13 +26,12 @@ ExclusiveArch: x86_64 s390x ppc64le aarch64
%global pcs_source_name %{name}-%{version_or_commit}
# ui_commit can be determined by hash, tag or branch
%global ui_commit 0.1.20
%global ui_modules_version 0.1.20
%global ui_commit 0.1.21
%global ui_modules_version 0.1.21
%global ui_src_name pcs-web-ui-%{ui_commit}
%global dacite_version 1.8.1
%global pyagentx_version 0.4.pcs.2
%global tornado_version 6.4.0
%global pycurl_version 7.45.3
# During its initialization, PycURL checks that the actual libcurl version
@ -49,21 +47,19 @@ ExclusiveArch: x86_64 s390x ppc64le aarch64
%global version_rubygem_base64 0.2.0
%global version_rubygem_childprocess 5.0.0
%global version_rubygem_ethon 0.16.0
%global version_rubygem_ffi 1.16.3
%global version_rubygem_mustermann 3.0.0
%global version_rubygem_nio4r 2.7.3
%global version_rubygem_puma 6.4.2
%global version_rubygem_rack 3.0.11
%global version_rubygem_ffi 1.17.0
%global version_rubygem_mustermann 3.0.3
%global version_rubygem_nio4r 2.7.4
%global version_rubygem_puma 6.4.3
%global version_rubygem_rack 3.1.8
%global version_rubygem_rack_protection 4.0.0
%global version_rubygem_rack_session 2.0.0
%global version_rubygem_rack_test 2.1.0
%global version_rubygem_rackup 2.1.0
%global version_rubygem_ruby2_keywords 0.0.5
%global version_rubygem_rackup 2.2.1
%global version_rubygem_sinatra 4.0.0
%global version_rubygem_tilt 2.3.0
%global version_rubygem_webrick 1.8.1
%global version_rubygem_tilt 2.4.0
%global required_pacemaker_version 2.1.0
%global required_pacemaker_version 3.0.0
%global pcs_bundled_dir pcs_bundled
%global pcsd_public_dir pcsd/public
@ -71,9 +67,7 @@ ExclusiveArch: x86_64 s390x ppc64le aarch64
%global rubygem_bundle_dir pcsd/vendor/bundle
%global rubygem_cache_dir %{rubygem_bundle_dir}/cache
%global ui_build_dir_standalone build_standalone
%global ui_build_dir_cockpit build_cockpit
%global ui_cockpit_dest ha-cluster
%global cockpit_dir %{_datadir}/cockpit/
%global ui_appstream_metainfo org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
%global pkg_pcs_snmp pcs-snmp
@ -90,7 +84,6 @@ Source0: %{url}/archive/%{?v_prefix}%{version_or_commit}/%{pcs_source_name}.tar.
Source21: https://github.com/konradhalas/dacite/archive/v%{dacite_version}/dacite-%{dacite_version}.tar.gz
Source22: https://github.com/ondrejmular/pyagentx/archive/v%{pyagentx_version}/pyagentx-%{pyagentx_version}.tar.gz
Source23: https://pypi.python.org/packages/source/p/pycurl/pycurl-%{pycurl_version}.tar.gz
Source24: https://github.com/tornadoweb/tornado/archive/v%{tornado_version}/tornado-%{tornado_version}.tar.gz
Source61: https://rubygems.org/downloads/backports-%{version_rubygem_backports}.gem
Source62: https://rubygems.org/downloads/base64-%{version_rubygem_base64}.gem
@ -105,10 +98,8 @@ Source70: https://rubygems.org/downloads/rack-protection-%{version_rubygem_rack_
Source71: https://rubygems.org/downloads/rack-session-%{version_rubygem_rack_session}.gem
Source72: https://rubygems.org/downloads/rack-test-%{version_rubygem_rack_test}.gem
Source73: https://rubygems.org/downloads/rackup-%{version_rubygem_rackup}.gem
Source74: https://rubygems.org/downloads/ruby2_keywords-%{version_rubygem_ruby2_keywords}.gem
Source75: https://rubygems.org/downloads/sinatra-%{version_rubygem_sinatra}.gem
Source76: https://rubygems.org/downloads/tilt-%{version_rubygem_tilt}.gem
Source77: https://rubygems.org/downloads/webrick-%{version_rubygem_webrick}.gem
Source100: https://github.com/ClusterLabs/pcs-web-ui/archive/%{ui_commit}/%{ui_src_name}.tar.gz
Source101: https://github.com/ClusterLabs/pcs-web-ui/releases/download/%{ui_commit}/pcs-web-ui-node-modules-%{ui_modules_version}.tar.xz
@ -117,7 +108,6 @@ Source101: https://github.com/ClusterLabs/pcs-web-ui/releases/download/%{ui_comm
# pcs patches: <= 200
# Patch1: name.patch
Patch1: do-not-support-cluster-setup-with-udp-u-transport.patch
Patch2: fix-tests-for-missing-webui.patch
# ui patches: >200
# Patch201: name-web-ui.patch
@ -131,6 +121,8 @@ BuildRequires: automake
BuildRequires: make
# printf from coreutils is used in makefile, head is used in spec
BuildRequires: coreutils
# find is used in Makefile and also somewhere else
BuildRequires: findutils
# python for pcs
BuildRequires: python3 >= 3.12
BuildRequires: python3-cryptography
@ -141,6 +133,7 @@ BuildRequires: python3-pip
BuildRequires: python3-pyparsing
# pcs build backend is setuptools
BuildRequires: python3-setuptools
Buildrequires: python3-tornado
# for building bundled python packages
BuildRequires: python3-wheel
# gcc for compiling custom rubygems and python extensions
@ -188,7 +181,7 @@ Requires: python3-cryptography
Requires: python3-dateutil >= 2.7.0
Requires: python3-lxml
Requires: python3-pyparsing
Requires: python3-setuptools
Requires: python3-tornado
# ruby and gems for pcsd
Requires: ruby >= 3.3.0
Requires: rubygems
@ -220,7 +213,6 @@ Requires: nss-tools
Provides: bundled(dacite) = %{dacite_version}
Provides: bundled(pycurl) = %{pycurl_version}
Provides: bundled(tornado) = %{tornado_version}
Provides: bundled(backports) = %{version_rubygem_backports}
Provides: bundled(base64) = %{version_rubygem_base64}
@ -235,10 +227,8 @@ Provides: bundled(rack_protection) = %{version_rubygem_rack_protection}
Provides: bundled(rack_session) = %{version_rubygem_rack_session}
Provides: bundled(rack_test) = %{version_rubygem_rack_test}
Provides: bundled(rackup) = %{version_rubygem_rackup}
Provides: bundled(ruby2_keywords) = %{version_rubygem_ruby2_keywords}
Provides: bundled(sinatra) = %{version_rubygem_sinatra}
Provides: bundled(tilt) = %{version_rubygem_tilt}
Provides: bundled(webrick) = %{version_rubygem_webrick}
# pcs-snmp subpackage definition
@ -332,8 +322,22 @@ update_times_patch(){
# * http://ftp.rpm.org/max-rpm/s1-rpm-inside-macros.html
# * https://rpm-software-management.github.io/rpm/manual/autosetup.html
# patch web-ui sources
%autosetup -D -T -b 100 -a 101 -S git -n %{ui_src_name} -N
%autopatch -p1 -m 201
# -q limits verbosity of %setup macro. Only tar -xof is executed instead of tar
# -xvvof. This option has to be used as first.
# This option is used to suppress a listing of all node_modules files that is
# too long and exceeds capacity of CI log
# -n <name> — Set Name of Build Directory
# -T — Do Not Perform Default Archive Unpacking
# -b <n> — Unpack The nth Sources Before Changing Directory
# -a <n> — Unpack The nth Sources After Changing Directory
#
# 1. unpack sources (-b 0)
# 2. then cd into sources tree (the setup macro itself)
# 3. then unpack node_modules into sources tree (-a 1).
%setup -q -T -b 100 -a 101 -n %{ui_src_name}
# patching is handled by applying the individual patches
# %%patch -P201
# update_times_patch %%{PATCH201}
# patch pcs sources
@ -341,7 +345,6 @@ update_times_patch(){
%autopatch -p1 -M 200
# update_times_patch %%{PATCH1}
update_times_patch %{PATCH1}
update_times_patch %{PATCH2}
# generate .tarball-version if building from an untagged commit, not a released version
# autogen uses git-version-gen which uses .tarball-version for generating version number
@ -367,10 +370,8 @@ cp -f %SOURCE70 %{rubygem_cache_dir}
cp -f %SOURCE71 %{rubygem_cache_dir}
cp -f %SOURCE72 %{rubygem_cache_dir}
cp -f %SOURCE73 %{rubygem_cache_dir}
cp -f %SOURCE74 %{rubygem_cache_dir}
cp -f %SOURCE75 %{rubygem_cache_dir}
cp -f %SOURCE76 %{rubygem_cache_dir}
cp -f %SOURCE77 %{rubygem_cache_dir}
# 2) prepare python bundles
@ -378,12 +379,13 @@ mkdir -p %{pcs_bundled_dir}/src
cp -f %SOURCE21 rpm/
cp -f %SOURCE22 rpm/
cp -f %SOURCE23 rpm/
cp -f %SOURCE24 rpm/
%build
%define debug_package %{nil}
# We left off by setting up pcs, so we are in its directory now
./autogen.sh
%{configure} --enable-local-build --enable-use-local-cache-only \
--enable-individual-bundling --enable-booth-enable-authfile-unset \
@ -391,41 +393,36 @@ cp -f %SOURCE24 rpm/
PYTHON=%{__python3} ruby_CFLAGS="%{optflags}" ruby_LIBS="%{build_ldflags}"
make all
# build pcs-web-ui
export BUILD_USE_CURRENT_NODE_MODULES=true
## standalone
export BUILD_DIR=%{_builddir}/%{ui_src_name}/%{ui_build_dir_standalone}
make -C %{_builddir}/%{ui_src_name} build
# Web UI installation
# Switch to web ui folder first
cd ../%{ui_src_name}
./autogen.sh
%{configure} \
--disable-standalone \
--with-cockpit-dir=%{cockpit_dir}
make all
## cockpit
export BUILD_DIR=%{_builddir}/%{ui_src_name}/%{ui_build_dir_cockpit}
export BUILD_FOR_COCKPIT=true
make -C %{_builddir}/%{ui_src_name} build
%install
rm -rf $RPM_BUILD_ROOT
rm -rf %{buildroot}
pwd
# Install cockpit pcs-web-ui
cd ../%{ui_src_name}
%make_install
# Workaround - metainfo should be installed by make install
mkdir -p %{buildroot}%{_datadir}/metainfo
cp -r %{_builddir}/%{ui_src_name}/packages/app/%{ui_appstream_metainfo} \
%{buildroot}%{_datadir}/metainfo/
# Install pcs
cd ../%{pcs_source_name}
%make_install
# RHEL-7716 - fix rubygem permissions - remove write access for owner's group
# and other users
chmod --recursive g-w,o-w ${RPM_BUILD_ROOT}%{_libdir}/%{rubygem_bundle_dir}
# install standalone pcs-web-ui
cp -r %{_builddir}/%{ui_src_name}/%{ui_build_dir_standalone} \
${RPM_BUILD_ROOT}%{_libdir}/%{pcsd_public_dir}/ui
# install cockpit pcs-web-ui
mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/cockpit/%{ui_cockpit_dest}
mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/metainfo
cp -r %{_builddir}/%{ui_src_name}/%{ui_build_dir_cockpit}/* \
${RPM_BUILD_ROOT}%{_datadir}/cockpit/%{ui_cockpit_dest}
cp -r %{_builddir}/%{ui_src_name}/packages/app/%{ui_appstream_metainfo} \
${RPM_BUILD_ROOT}%{_datadir}/metainfo/
chmod --recursive g-w,o-w %{buildroot}%{_libdir}/%{rubygem_bundle_dir}
# prepare license files
mv %{rubygem_bundle_dir}/gems/backports-%{version_rubygem_backports}/LICENSE.txt backports_LICENSE.txt
@ -444,10 +441,8 @@ mv %{rubygem_bundle_dir}/gems/rack-protection-%{version_rubygem_rack_protection}
mv %{rubygem_bundle_dir}/gems/rack-session-%{version_rubygem_rack_session}/license.md rack-session_license.md
mv %{rubygem_bundle_dir}/gems/rack-test-%{version_rubygem_rack_test}/MIT-LICENSE.txt rack-test_MIT-LICENSE.txt
mv %{rubygem_bundle_dir}/gems/rackup-%{version_rubygem_rackup}/license.md rackup_license.md
mv %{rubygem_bundle_dir}/gems/ruby2_keywords-%{version_rubygem_ruby2_keywords}/LICENSE ruby2_keywords_LICENSE
mv %{rubygem_bundle_dir}/gems/sinatra-%{version_rubygem_sinatra}/LICENSE sinatra_LICENSE
mv %{rubygem_bundle_dir}/gems/tilt-%{version_rubygem_tilt}/COPYING tilt_COPYING
mv %{rubygem_bundle_dir}/gems/webrick-%{version_rubygem_webrick}/LICENSE.txt webrick_LICENSE.txt
cp %{pcs_bundled_dir}/src/dacite-*/LICENSE dacite_LICENSE
cp %{pcs_bundled_dir}/src/dacite-*/README.md dacite_README.md
@ -460,9 +455,6 @@ cp %{pcs_bundled_dir}/src/pycurl-*/COPYING-LGPL pycurl_COPYING-LGPL
cp %{pcs_bundled_dir}/src/pycurl-*/COPYING-MIT pycurl_COPYING-MIT
cp %{pcs_bundled_dir}/src/pycurl-*/README.rst pycurl_README.rst
cp %{pcs_bundled_dir}/src/tornado-*/LICENSE tornado_LICENSE
cp %{pcs_bundled_dir}/src/tornado-*/README.rst tornado_README.rst
# We are not building debug package for pcs but we need to add MiniDebuginfo
# to the bundled shared libraries from rubygem extensions in order to satisfy
# rpminspect's binary stripping checker.
@ -471,24 +463,32 @@ cp %{pcs_bundled_dir}/src/tornado-*/README.rst tornado_README.rst
find-debuginfo -j2 -m -i -S debugsourcefiles.list
# find-debuginfo generated some files into /usr/lib/debug and
# /usr/src/debug/ that we don't want in the package
rm -rf $RPM_BUILD_ROOT%{_libdir}/debug
rm -rf $RPM_BUILD_ROOT/usr/lib/debug
rm -rf $RPM_BUILD_ROOT%{_prefix}/src/debug
rm -rf %{buildroot}%{_libdir}/debug
rm -rf %{buildroot}/usr/lib/debug
rm -rf %{buildroot}%{_prefix}/src/debug
# We can remove files required for gem compilation
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/ffi-%{version_rubygem_ffi}/ext
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/nio4r-%{version_rubygem_nio4r}/ext
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/puma-%{version_rubygem_puma}/ext
rm -rf %{buildroot}%{_libdir}/%{rubygem_bundle_dir}/gems/ffi-%{version_rubygem_ffi}/ext
rm -rf %{buildroot}%{_libdir}/%{rubygem_bundle_dir}/gems/nio4r-%{version_rubygem_nio4r}/ext
rm -rf %{buildroot}%{_libdir}/%{rubygem_bundle_dir}/gems/puma-%{version_rubygem_puma}/ext
# Sinatra contains example applications which are unnecessary (discovered by brp_mangle_shebangs)
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/sinatra-%{version_rubygem_sinatra}/examples
rm -rf %{buildroot}%{_libdir}/%{rubygem_bundle_dir}/gems/sinatra-%{version_rubygem_sinatra}/examples
# Puma contains an unnecessary rc init script (discovered by brp_mangle_shebangs)
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/puma-%{version_rubygem_puma}/docs/jungle/rc.d
rm -rf %{buildroot}%{_libdir}/%{rubygem_bundle_dir}/gems/puma-%{version_rubygem_puma}/docs/jungle/rc.d
# Remove unused rubygem executables with wrong shebangs (discovered by brp_mangle_shebangs)
rm -fv %{buildroot}/%{_libdir}/pcsd/vendor/bundle/gems/puma-*/bin/puma
rm -fv %{buildroot}/%{_libdir}/pcsd/vendor/bundle/gems/puma-*/bin/pumactl
rm -fv %{buildroot}/%{_libdir}/pcsd/vendor/bundle/gems/rackup-*/bin/rackup
rm -fv %{buildroot}/%{_libdir}/pcsd/vendor/bundle/gems/tilt-*/bin/tilt
%check
# Run validation of cockpit metainfo
appstream-util validate-relax --nonet ${RPM_BUILD_ROOT}%{_datadir}/metainfo/%{ui_appstream_metainfo}
appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/%{ui_appstream_metainfo}
# In the building environment LC_CTYPE is set to C which causes tests to fail
# due to python prints a warning about it to stderr. The following environment
@ -514,8 +514,8 @@ run_all_tests(){
test_result_python=$?
#run pcsd tests and remove them
GEM_HOME=$RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir} ruby \
-I$RPM_BUILD_ROOT%{_libdir}/pcsd \
GEM_HOME=%{buildroot}%{_libdir}/%{rubygem_bundle_dir} ruby \
-I%{buildroot}%{_libdir}/pcsd \
-Ipcsd/test \
pcsd/test/test_all_suite.rb
test_result_ruby=$?
@ -562,12 +562,10 @@ run_all_tests
%doc CHANGELOG.md
%doc README.md
%doc dacite_README.md
%doc tornado_README.rst
%doc pycurl_README.rst
%license COPYING
# python dependency licenses
%license dacite_LICENSE
%license tornado_LICENSE
%license pycurl_COPYING-LGPL
%license pycurl_COPYING-MIT
# rubygem licenses
@ -587,10 +585,8 @@ run_all_tests
%license rack-session_license.md
%license rack-test_MIT-LICENSE.txt
%license rackup_license.md
%license ruby2_keywords_LICENSE
%license sinatra_LICENSE
%license tilt_COPYING
%license webrick_LICENSE.txt
%{python3_sitelib}/*
%{_sbindir}/pcs
%{_sbindir}/pcsd
@ -633,11 +629,20 @@ run_all_tests
%license pyagentx_LICENSE.txt
%files -n %{pkg_cockpit_ha_cluster}
%{_datadir}/cockpit/%{ui_cockpit_dest}
%{cockpit_dir}
%{_datadir}/metainfo/%{ui_appstream_metainfo}
%changelog
* Wed Nov 13 2024 Michal Pospíšil <mpospisi@redhat.com> - 0.12.0~b1-1
- Rebased to the latest sources (see CHANGELOG.md)
Resolves: RHEL-21047, RHEL-33386, RHEL-38483, RHEL-44432, RHEL-48220, RHEL-49520, RHEL-49521, RHEL-49524, RHEL-49527, RHEL-55723, RHEL-61747, RHEL-61889, RHEL-62719
- Updated pcs-web-ui in cockpit-ha-cluster to 0.1.21
Resolves: RHEL-30688, RHEL-30691, RHEL-30693, RHEL-30701, RHEL-47158, RHEL-52846, RHEL-53363
- Updated bundled rubygems: ffi, mustermann, puma, rack, rackup, tilt
- Removed bundled rubygem webrick, ruby2_keywords
- New runtime dependency python3-tornado which has been bundled in previous versions
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 0.12.0~a1-4
- Bump release for October 2024 mass rebuild:
Resolves: RHEL-64018

Loading…
Cancel
Save