import pcs-0.10.10-4.el8
This commit is contained in:
parent
fc10e85f5f
commit
3360aae91e
7
.gitignore
vendored
7
.gitignore
vendored
@ -9,14 +9,15 @@ SOURCES/ffi-1.13.1.gem
|
|||||||
SOURCES/json-2.3.0.gem
|
SOURCES/json-2.3.0.gem
|
||||||
SOURCES/mustermann-1.1.1.gem
|
SOURCES/mustermann-1.1.1.gem
|
||||||
SOURCES/open4-1.3.4-1.gem
|
SOURCES/open4-1.3.4-1.gem
|
||||||
SOURCES/pcs-0.10.8.tar.gz
|
SOURCES/pcs-0.10.10.tar.gz
|
||||||
SOURCES/pcs-web-ui-0.1.5.tar.gz
|
SOURCES/pcs-web-ui-0.1.7.tar.gz
|
||||||
SOURCES/pcs-web-ui-node-modules-0.1.5.tar.xz
|
SOURCES/pcs-web-ui-node-modules-0.1.7.tar.xz
|
||||||
SOURCES/pyagentx-0.4.pcs.2.tar.gz
|
SOURCES/pyagentx-0.4.pcs.2.tar.gz
|
||||||
SOURCES/python-dateutil-2.8.1.tar.gz
|
SOURCES/python-dateutil-2.8.1.tar.gz
|
||||||
SOURCES/rack-2.2.3.gem
|
SOURCES/rack-2.2.3.gem
|
||||||
SOURCES/rack-protection-2.0.8.1.gem
|
SOURCES/rack-protection-2.0.8.1.gem
|
||||||
SOURCES/rack-test-1.1.0.gem
|
SOURCES/rack-test-1.1.0.gem
|
||||||
|
SOURCES/rexml-3.2.5.gem
|
||||||
SOURCES/ruby2_keywords-0.0.2.gem
|
SOURCES/ruby2_keywords-0.0.2.gem
|
||||||
SOURCES/sinatra-2.0.8.1.gem
|
SOURCES/sinatra-2.0.8.1.gem
|
||||||
SOURCES/thin-1.7.2.gem
|
SOURCES/thin-1.7.2.gem
|
||||||
|
@ -9,14 +9,15 @@ cfa25e7a3760c3ec16723cb8263d9b7a52d0eadf SOURCES/ffi-1.13.1.gem
|
|||||||
0230e8c5a37f1543982e5b04be503dd5f9004b47 SOURCES/json-2.3.0.gem
|
0230e8c5a37f1543982e5b04be503dd5f9004b47 SOURCES/json-2.3.0.gem
|
||||||
50a4e37904485810cb05e27d75c9783e5a8f3402 SOURCES/mustermann-1.1.1.gem
|
50a4e37904485810cb05e27d75c9783e5a8f3402 SOURCES/mustermann-1.1.1.gem
|
||||||
41a7fe9f8e3e02da5ae76c821b89c5b376a97746 SOURCES/open4-1.3.4-1.gem
|
41a7fe9f8e3e02da5ae76c821b89c5b376a97746 SOURCES/open4-1.3.4-1.gem
|
||||||
0e6b705715023ec5224ca05e977b8888f2a1b1e6 SOURCES/pcs-0.10.8.tar.gz
|
a1c0585455b7e050c33598598a045ccd2776cb28 SOURCES/pcs-0.10.10.tar.gz
|
||||||
f23b14786b1911d498612bf0e90f344bcc4915c3 SOURCES/pcs-web-ui-0.1.5.tar.gz
|
b9ed12ca957c2f204ec37ea2836b924c36fab379 SOURCES/pcs-web-ui-0.1.7.tar.gz
|
||||||
57beab1c4bed96d7f9fc35261e96f78babb06980 SOURCES/pcs-web-ui-node-modules-0.1.5.tar.xz
|
8824285e6f1c2807d9222d573c6e6df1e50d8410 SOURCES/pcs-web-ui-node-modules-0.1.7.tar.xz
|
||||||
3176b2f2b332c2b6bf79fe882e83feecf3d3f011 SOURCES/pyagentx-0.4.pcs.2.tar.gz
|
3176b2f2b332c2b6bf79fe882e83feecf3d3f011 SOURCES/pyagentx-0.4.pcs.2.tar.gz
|
||||||
bd26127e57f83a10f656b62c46524c15aeb844dd SOURCES/python-dateutil-2.8.1.tar.gz
|
bd26127e57f83a10f656b62c46524c15aeb844dd SOURCES/python-dateutil-2.8.1.tar.gz
|
||||||
345b7169d4d2d62176a225510399963bad62b68f SOURCES/rack-2.2.3.gem
|
345b7169d4d2d62176a225510399963bad62b68f SOURCES/rack-2.2.3.gem
|
||||||
1f046e23baca8beece3b38c60382f44aa2b2cb41 SOURCES/rack-protection-2.0.8.1.gem
|
1f046e23baca8beece3b38c60382f44aa2b2cb41 SOURCES/rack-protection-2.0.8.1.gem
|
||||||
b80bc5ca38a885e747271675ba91dd3d02136bf1 SOURCES/rack-test-1.1.0.gem
|
b80bc5ca38a885e747271675ba91dd3d02136bf1 SOURCES/rack-test-1.1.0.gem
|
||||||
|
e7f48fa5fb2d92e6cb21d6b1638fe41a5a7c4287 SOURCES/rexml-3.2.5.gem
|
||||||
0be571aacb5d6a212a30af3f322a7000d8af1ef9 SOURCES/ruby2_keywords-0.0.2.gem
|
0be571aacb5d6a212a30af3f322a7000d8af1ef9 SOURCES/ruby2_keywords-0.0.2.gem
|
||||||
04cca7a5d9d641fe076e4e24dc5b6ff31922f4c3 SOURCES/sinatra-2.0.8.1.gem
|
04cca7a5d9d641fe076e4e24dc5b6ff31922f4c3 SOURCES/sinatra-2.0.8.1.gem
|
||||||
41395e86322ffd31f3a7aef1f697bda3e1e2d6b9 SOURCES/thin-1.7.2.gem
|
41395e86322ffd31f3a7aef1f697bda3e1e2d6b9 SOURCES/thin-1.7.2.gem
|
||||||
|
1172
SOURCES/add-missing-file-test_stonith_update_scsi_devices.py.patch
Normal file
1172
SOURCES/add-missing-file-test_stonith_update_scsi_devices.py.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,787 @@
|
|||||||
|
From cf68ded959ad03244c94de308b79fc1af806a474 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Mular <omular@redhat.com>
|
||||||
|
Date: Wed, 15 Sep 2021 07:55:50 +0200
|
||||||
|
Subject: [PATCH 1/2] fix unfencing in `pcs stonith update-scsi-devices`
|
||||||
|
|
||||||
|
* do not unfence newly added devices on fenced cluster nodes
|
||||||
|
---
|
||||||
|
pcs/common/reports/codes.py | 6 ++
|
||||||
|
pcs/common/reports/messages.py | 41 +++++++
|
||||||
|
pcs/lib/commands/scsi.py | 55 +++++++++-
|
||||||
|
pcs/lib/commands/stonith.py | 26 +++--
|
||||||
|
pcs/lib/communication/scsi.py | 40 ++++---
|
||||||
|
.../tier0/common/reports/test_messages.py | 24 +++++
|
||||||
|
pcs_test/tier0/lib/commands/test_scsi.py | 101 ++++++++++++++++--
|
||||||
|
.../test_stonith_update_scsi_devices.py | 87 ++++++++++++---
|
||||||
|
.../tools/command_env/config_http_scsi.py | 16 ++-
|
||||||
|
.../tools/command_env/config_runner_scsi.py | 36 ++++++-
|
||||||
|
pcsd/api_v1.rb | 2 +-
|
||||||
|
pcsd/capabilities.xml | 8 +-
|
||||||
|
12 files changed, 387 insertions(+), 55 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/pcs/common/reports/codes.py b/pcs/common/reports/codes.py
|
||||||
|
index bbd61500..4bee0bac 100644
|
||||||
|
--- a/pcs/common/reports/codes.py
|
||||||
|
+++ b/pcs/common/reports/codes.py
|
||||||
|
@@ -468,6 +468,12 @@ STONITH_RESTARTLESS_UPDATE_UNSUPPORTED_AGENT = M(
|
||||||
|
"STONITH_RESTARTLESS_UPDATE_UNSUPPORTED_AGENT"
|
||||||
|
)
|
||||||
|
STONITH_UNFENCING_FAILED = M("STONITH_UNFENCING_FAILED")
|
||||||
|
+STONITH_UNFENCING_DEVICE_STATUS_FAILED = M(
|
||||||
|
+ "STONITH_UNFENCING_DEVICE_STATUS_FAILED"
|
||||||
|
+)
|
||||||
|
+STONITH_UNFENCING_SKIPPED_DEVICES_FENCED = M(
|
||||||
|
+ "STONITH_UNFENCING_SKIPPED_DEVICES_FENCED"
|
||||||
|
+)
|
||||||
|
STONITH_RESTARTLESS_UPDATE_UNABLE_TO_PERFORM = M(
|
||||||
|
"STONITH_RESTARTLESS_UPDATE_UNABLE_TO_PERFORM"
|
||||||
|
)
|
||||||
|
diff --git a/pcs/common/reports/messages.py b/pcs/common/reports/messages.py
|
||||||
|
index f9688437..be8dd154 100644
|
||||||
|
--- a/pcs/common/reports/messages.py
|
||||||
|
+++ b/pcs/common/reports/messages.py
|
||||||
|
@@ -2782,6 +2782,47 @@ class StonithUnfencingFailed(ReportItemMessage):
|
||||||
|
return f"Unfencing failed:\n{self.reason}"
|
||||||
|
|
||||||
|
|
||||||
|
+@dataclass(frozen=True)
|
||||||
|
+class StonithUnfencingDeviceStatusFailed(ReportItemMessage):
|
||||||
|
+ """
|
||||||
|
+ Unfencing failed on a cluster node.
|
||||||
|
+ """
|
||||||
|
+
|
||||||
|
+ device: str
|
||||||
|
+ reason: str
|
||||||
|
+
|
||||||
|
+ _code = codes.STONITH_UNFENCING_DEVICE_STATUS_FAILED
|
||||||
|
+
|
||||||
|
+ @property
|
||||||
|
+ def message(self) -> str:
|
||||||
|
+ return (
|
||||||
|
+ "Unfencing failed, unable to check status of device "
|
||||||
|
+ f"'{self.device}': {self.reason}"
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+@dataclass(frozen=True)
|
||||||
|
+class StonithUnfencingSkippedDevicesFenced(ReportItemMessage):
|
||||||
|
+ """
|
||||||
|
+ Unfencing skipped on a cluster node, because fenced devices were found on
|
||||||
|
+ the node.
|
||||||
|
+ """
|
||||||
|
+
|
||||||
|
+ devices: List[str]
|
||||||
|
+
|
||||||
|
+ _code = codes.STONITH_UNFENCING_SKIPPED_DEVICES_FENCED
|
||||||
|
+
|
||||||
|
+ @property
|
||||||
|
+ def message(self) -> str:
|
||||||
|
+ return (
|
||||||
|
+ "Unfencing skipped, {device_pl} {devices} {is_pl} fenced"
|
||||||
|
+ ).format(
|
||||||
|
+ device_pl=format_plural(self.devices, "device"),
|
||||||
|
+ devices=format_list(self.devices),
|
||||||
|
+ is_pl=format_plural(self.devices, "is", "are"),
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class StonithRestartlessUpdateUnableToPerform(ReportItemMessage):
|
||||||
|
"""
|
||||||
|
diff --git a/pcs/lib/commands/scsi.py b/pcs/lib/commands/scsi.py
|
||||||
|
index 31a3ef2d..ff20a563 100644
|
||||||
|
--- a/pcs/lib/commands/scsi.py
|
||||||
|
+++ b/pcs/lib/commands/scsi.py
|
||||||
|
@@ -8,20 +8,65 @@ from pcs.lib.env import LibraryEnvironment
|
||||||
|
from pcs.lib.errors import LibraryError
|
||||||
|
|
||||||
|
|
||||||
|
-def unfence_node(env: LibraryEnvironment, node: str, devices: Iterable[str]):
|
||||||
|
+def unfence_node(
|
||||||
|
+ env: LibraryEnvironment,
|
||||||
|
+ node: str,
|
||||||
|
+ original_devices: Iterable[str],
|
||||||
|
+ updated_devices: Iterable[str],
|
||||||
|
+) -> None:
|
||||||
|
"""
|
||||||
|
- Unfence scsi devices on a node by calling fence_scsi agent script.
|
||||||
|
+ Unfence scsi devices on a node by calling fence_scsi agent script. Only
|
||||||
|
+ newly added devices will be unfenced (set(updated_devices) -
|
||||||
|
+ set(original_devices)). Before unfencing, original devices are be checked
|
||||||
|
+ if any of them are not fenced. If there is a fenced device, unfencing will
|
||||||
|
+ be skipped.
|
||||||
|
|
||||||
|
env -- provides communication with externals
|
||||||
|
node -- node name on wich is unfencing performed
|
||||||
|
- devices -- scsi devices to be unfenced
|
||||||
|
+ original_devices -- list of devices defined before update
|
||||||
|
+ updated_devices -- list of devices defined after update
|
||||||
|
"""
|
||||||
|
+ devices_to_unfence = set(updated_devices) - set(original_devices)
|
||||||
|
+ if not devices_to_unfence:
|
||||||
|
+ return
|
||||||
|
+ fence_scsi_bin = os.path.join(settings.fence_agent_binaries, "fence_scsi")
|
||||||
|
+ fenced_devices = []
|
||||||
|
+ for device in original_devices:
|
||||||
|
+ stdout, stderr, return_code = env.cmd_runner().run(
|
||||||
|
+ [
|
||||||
|
+ fence_scsi_bin,
|
||||||
|
+ "--action=status",
|
||||||
|
+ f"--devices={device}",
|
||||||
|
+ f"--plug={node}",
|
||||||
|
+ ]
|
||||||
|
+ )
|
||||||
|
+ if return_code == 2:
|
||||||
|
+ fenced_devices.append(device)
|
||||||
|
+ elif return_code != 0:
|
||||||
|
+ raise LibraryError(
|
||||||
|
+ reports.ReportItem.error(
|
||||||
|
+ reports.messages.StonithUnfencingDeviceStatusFailed(
|
||||||
|
+ device, join_multilines([stderr, stdout])
|
||||||
|
+ )
|
||||||
|
+ )
|
||||||
|
+ )
|
||||||
|
+ if fenced_devices:
|
||||||
|
+ # At least one of existing devices is off, which means the node has
|
||||||
|
+ # been fenced and new devices should not be unfenced.
|
||||||
|
+ env.report_processor.report(
|
||||||
|
+ reports.ReportItem.info(
|
||||||
|
+ reports.messages.StonithUnfencingSkippedDevicesFenced(
|
||||||
|
+ fenced_devices
|
||||||
|
+ )
|
||||||
|
+ )
|
||||||
|
+ )
|
||||||
|
+ return
|
||||||
|
stdout, stderr, return_code = env.cmd_runner().run(
|
||||||
|
[
|
||||||
|
- os.path.join(settings.fence_agent_binaries, "fence_scsi"),
|
||||||
|
+ fence_scsi_bin,
|
||||||
|
"--action=on",
|
||||||
|
"--devices",
|
||||||
|
- ",".join(sorted(devices)),
|
||||||
|
+ ",".join(sorted(devices_to_unfence)),
|
||||||
|
f"--plug={node}",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
diff --git a/pcs/lib/commands/stonith.py b/pcs/lib/commands/stonith.py
|
||||||
|
index 6f26e7d3..0dcf44f2 100644
|
||||||
|
--- a/pcs/lib/commands/stonith.py
|
||||||
|
+++ b/pcs/lib/commands/stonith.py
|
||||||
|
@@ -453,7 +453,8 @@ def _update_scsi_devices_get_element_and_devices(
|
||||||
|
|
||||||
|
def _unfencing_scsi_devices(
|
||||||
|
env: LibraryEnvironment,
|
||||||
|
- device_list: Iterable[str],
|
||||||
|
+ original_devices: Iterable[str],
|
||||||
|
+ updated_devices: Iterable[str],
|
||||||
|
force_flags: Container[reports.types.ForceCode] = (),
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
@@ -461,9 +462,13 @@ def _unfencing_scsi_devices(
|
||||||
|
to pcsd and corosync is running.
|
||||||
|
|
||||||
|
env -- provides all for communication with externals
|
||||||
|
- device_list -- devices to be unfenced
|
||||||
|
+ original_devices -- devices before update
|
||||||
|
+ updated_devices -- devices after update
|
||||||
|
force_flags -- list of flags codes
|
||||||
|
"""
|
||||||
|
+ devices_to_unfence = set(updated_devices) - set(original_devices)
|
||||||
|
+ if not devices_to_unfence:
|
||||||
|
+ return
|
||||||
|
cluster_nodes_names, nodes_report_list = get_existing_nodes_names(
|
||||||
|
env.get_corosync_conf(),
|
||||||
|
error_on_missing_name=True,
|
||||||
|
@@ -487,7 +492,11 @@ def _unfencing_scsi_devices(
|
||||||
|
online_corosync_target_list = run_and_raise(
|
||||||
|
env.get_node_communicator(), com_cmd
|
||||||
|
)
|
||||||
|
- com_cmd = Unfence(env.report_processor, sorted(device_list))
|
||||||
|
+ com_cmd = Unfence(
|
||||||
|
+ env.report_processor,
|
||||||
|
+ original_devices=sorted(original_devices),
|
||||||
|
+ updated_devices=sorted(updated_devices),
|
||||||
|
+ )
|
||||||
|
com_cmd.set_targets(online_corosync_target_list)
|
||||||
|
run_and_raise(env.get_node_communicator(), com_cmd)
|
||||||
|
|
||||||
|
@@ -531,9 +540,9 @@ def update_scsi_devices(
|
||||||
|
IdProvider(stonith_el),
|
||||||
|
set_device_list,
|
||||||
|
)
|
||||||
|
- devices_for_unfencing = set(set_device_list).difference(current_device_list)
|
||||||
|
- if devices_for_unfencing:
|
||||||
|
- _unfencing_scsi_devices(env, devices_for_unfencing, force_flags)
|
||||||
|
+ _unfencing_scsi_devices(
|
||||||
|
+ env, current_device_list, set_device_list, force_flags
|
||||||
|
+ )
|
||||||
|
env.push_cib()
|
||||||
|
|
||||||
|
|
||||||
|
@@ -585,6 +594,7 @@ def update_scsi_devices_add_remove(
|
||||||
|
IdProvider(stonith_el),
|
||||||
|
updated_device_set,
|
||||||
|
)
|
||||||
|
- if add_device_list:
|
||||||
|
- _unfencing_scsi_devices(env, add_device_list, force_flags)
|
||||||
|
+ _unfencing_scsi_devices(
|
||||||
|
+ env, current_device_list, updated_device_set, force_flags
|
||||||
|
+ )
|
||||||
|
env.push_cib()
|
||||||
|
diff --git a/pcs/lib/communication/scsi.py b/pcs/lib/communication/scsi.py
|
||||||
|
index 7b272017..250d67aa 100644
|
||||||
|
--- a/pcs/lib/communication/scsi.py
|
||||||
|
+++ b/pcs/lib/communication/scsi.py
|
||||||
|
@@ -1,4 +1,5 @@
|
||||||
|
import json
|
||||||
|
+from typing import Iterable
|
||||||
|
|
||||||
|
from dacite import DaciteError
|
||||||
|
|
||||||
|
@@ -26,9 +27,15 @@ class Unfence(
|
||||||
|
MarkSuccessfulMixin,
|
||||||
|
RunRemotelyBase,
|
||||||
|
):
|
||||||
|
- def __init__(self, report_processor, devices):
|
||||||
|
+ def __init__(
|
||||||
|
+ self,
|
||||||
|
+ report_processor: reports.ReportProcessor,
|
||||||
|
+ original_devices: Iterable[str],
|
||||||
|
+ updated_devices: Iterable[str],
|
||||||
|
+ ) -> None:
|
||||||
|
super().__init__(report_processor)
|
||||||
|
- self._devices = devices
|
||||||
|
+ self._original_devices = original_devices
|
||||||
|
+ self._updated_devices = updated_devices
|
||||||
|
|
||||||
|
def _get_request_data(self):
|
||||||
|
return None
|
||||||
|
@@ -38,9 +45,13 @@ class Unfence(
|
||||||
|
Request(
|
||||||
|
target,
|
||||||
|
RequestData(
|
||||||
|
- "api/v1/scsi-unfence-node/v1",
|
||||||
|
+ "api/v1/scsi-unfence-node/v2",
|
||||||
|
data=json.dumps(
|
||||||
|
- {"devices": self._devices, "node": target.label}
|
||||||
|
+ dict(
|
||||||
|
+ node=target.label,
|
||||||
|
+ original_devices=self._original_devices,
|
||||||
|
+ updated_devices=self._updated_devices,
|
||||||
|
+ )
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
@@ -48,7 +59,9 @@ class Unfence(
|
||||||
|
]
|
||||||
|
|
||||||
|
def _process_response(self, response):
|
||||||
|
- report_item = response_to_report_item(response)
|
||||||
|
+ report_item = response_to_report_item(
|
||||||
|
+ response, report_pcsd_too_old_on_404=True
|
||||||
|
+ )
|
||||||
|
if report_item:
|
||||||
|
self._report(report_item)
|
||||||
|
return
|
||||||
|
@@ -57,15 +70,14 @@ class Unfence(
|
||||||
|
result = from_dict(
|
||||||
|
InternalCommunicationResultDto, json.loads(response.data)
|
||||||
|
)
|
||||||
|
- if result.status != const.COM_STATUS_SUCCESS:
|
||||||
|
- context = reports.ReportItemContext(node_label)
|
||||||
|
- self._report_list(
|
||||||
|
- [
|
||||||
|
- reports.report_dto_to_item(report, context)
|
||||||
|
- for report in result.report_list
|
||||||
|
- ]
|
||||||
|
- )
|
||||||
|
- else:
|
||||||
|
+ context = reports.ReportItemContext(node_label)
|
||||||
|
+ self._report_list(
|
||||||
|
+ [
|
||||||
|
+ reports.report_dto_to_item(report, context)
|
||||||
|
+ for report in result.report_list
|
||||||
|
+ ]
|
||||||
|
+ )
|
||||||
|
+ if result.status == const.COM_STATUS_SUCCESS:
|
||||||
|
self._on_success()
|
||||||
|
|
||||||
|
except (json.JSONDecodeError, DaciteError):
|
||||||
|
diff --git a/pcs_test/tier0/common/reports/test_messages.py b/pcs_test/tier0/common/reports/test_messages.py
|
||||||
|
index b0826cfd..05c3f619 100644
|
||||||
|
--- a/pcs_test/tier0/common/reports/test_messages.py
|
||||||
|
+++ b/pcs_test/tier0/common/reports/test_messages.py
|
||||||
|
@@ -1904,6 +1904,30 @@ class StonithUnfencingFailed(NameBuildTest):
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
+class StonithUnfencingDeviceStatusFailed(NameBuildTest):
|
||||||
|
+ def test_build_message(self):
|
||||||
|
+ self.assert_message_from_report(
|
||||||
|
+ "Unfencing failed, unable to check status of device 'dev1': reason",
|
||||||
|
+ reports.StonithUnfencingDeviceStatusFailed("dev1", "reason"),
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class StonithUnfencingSkippedDevicesFenced(NameBuildTest):
|
||||||
|
+ def test_one_device(self):
|
||||||
|
+ self.assert_message_from_report(
|
||||||
|
+ "Unfencing skipped, device 'dev1' is fenced",
|
||||||
|
+ reports.StonithUnfencingSkippedDevicesFenced(["dev1"]),
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+ def test_multiple_devices(self):
|
||||||
|
+ self.assert_message_from_report(
|
||||||
|
+ "Unfencing skipped, devices 'dev1', 'dev2', 'dev3' are fenced",
|
||||||
|
+ reports.StonithUnfencingSkippedDevicesFenced(
|
||||||
|
+ ["dev2", "dev1", "dev3"]
|
||||||
|
+ ),
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+
|
||||||
|
class StonithRestartlessUpdateUnableToPerform(NameBuildTest):
|
||||||
|
def test_build_message(self):
|
||||||
|
self.assert_message_from_report(
|
||||||
|
diff --git a/pcs_test/tier0/lib/commands/test_scsi.py b/pcs_test/tier0/lib/commands/test_scsi.py
|
||||||
|
index de75743f..8ef9836a 100644
|
||||||
|
--- a/pcs_test/tier0/lib/commands/test_scsi.py
|
||||||
|
+++ b/pcs_test/tier0/lib/commands/test_scsi.py
|
||||||
|
@@ -10,26 +10,113 @@ from pcs.lib.commands import scsi
|
||||||
|
class TestUnfenceNode(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.env_assist, self.config = get_env_tools(self)
|
||||||
|
+ self.old_devices = ["device1", "device3"]
|
||||||
|
+ self.new_devices = ["device3", "device0", "device2"]
|
||||||
|
+ self.added_devices = set(self.new_devices) - set(self.old_devices)
|
||||||
|
+ self.node = "node1"
|
||||||
|
|
||||||
|
- def test_success(self):
|
||||||
|
- self.config.runner.scsi.unfence_node("node1", ["/dev/sda", "/dev/sdb"])
|
||||||
|
+ def test_success_devices_to_unfence(self):
|
||||||
|
+ for old_dev in self.old_devices:
|
||||||
|
+ self.config.runner.scsi.get_status(
|
||||||
|
+ self.node, old_dev, name=f"runner.scsi.is_fenced.{old_dev}"
|
||||||
|
+ )
|
||||||
|
+ self.config.runner.scsi.unfence_node(self.node, self.added_devices)
|
||||||
|
scsi.unfence_node(
|
||||||
|
- self.env_assist.get_env(), "node1", ["/dev/sdb", "/dev/sda"]
|
||||||
|
+ self.env_assist.get_env(),
|
||||||
|
+ self.node,
|
||||||
|
+ self.old_devices,
|
||||||
|
+ self.new_devices,
|
||||||
|
)
|
||||||
|
self.env_assist.assert_reports([])
|
||||||
|
|
||||||
|
- def test_failure(self):
|
||||||
|
+ def test_success_no_devices_to_unfence(self):
|
||||||
|
+ scsi.unfence_node(
|
||||||
|
+ self.env_assist.get_env(),
|
||||||
|
+ self.node,
|
||||||
|
+ {"device1", "device2", "device3"},
|
||||||
|
+ {"device3"},
|
||||||
|
+ )
|
||||||
|
+ self.env_assist.assert_reports([])
|
||||||
|
+
|
||||||
|
+ def test_unfencing_failure(self):
|
||||||
|
+ err_msg = "stderr"
|
||||||
|
+ for old_dev in self.old_devices:
|
||||||
|
+ self.config.runner.scsi.get_status(
|
||||||
|
+ self.node, old_dev, name=f"runner.scsi.is_fenced.{old_dev}"
|
||||||
|
+ )
|
||||||
|
self.config.runner.scsi.unfence_node(
|
||||||
|
- "node1", ["/dev/sda", "/dev/sdb"], stderr="stderr", return_code=1
|
||||||
|
+ self.node, self.added_devices, stderr=err_msg, return_code=1
|
||||||
|
)
|
||||||
|
self.env_assist.assert_raise_library_error(
|
||||||
|
lambda: scsi.unfence_node(
|
||||||
|
- self.env_assist.get_env(), "node1", ["/dev/sdb", "/dev/sda"]
|
||||||
|
+ self.env_assist.get_env(),
|
||||||
|
+ self.node,
|
||||||
|
+ self.old_devices,
|
||||||
|
+ self.new_devices,
|
||||||
|
),
|
||||||
|
[
|
||||||
|
fixture.error(
|
||||||
|
- report_codes.STONITH_UNFENCING_FAILED, reason="stderr"
|
||||||
|
+ report_codes.STONITH_UNFENCING_FAILED, reason=err_msg
|
||||||
|
)
|
||||||
|
],
|
||||||
|
expected_in_processor=False,
|
||||||
|
)
|
||||||
|
+
|
||||||
|
+ def test_device_status_failed(self):
|
||||||
|
+ err_msg = "stderr"
|
||||||
|
+ new_devices = ["device1", "device2", "device3", "device4"]
|
||||||
|
+ old_devices = new_devices[:-1]
|
||||||
|
+ ok_devices = new_devices[0:2]
|
||||||
|
+ err_device = new_devices[2]
|
||||||
|
+ for dev in ok_devices:
|
||||||
|
+ self.config.runner.scsi.get_status(
|
||||||
|
+ self.node, dev, name=f"runner.scsi.is_fenced.{dev}"
|
||||||
|
+ )
|
||||||
|
+ self.config.runner.scsi.get_status(
|
||||||
|
+ self.node,
|
||||||
|
+ err_device,
|
||||||
|
+ name=f"runner.scsi.is_fenced.{err_device}",
|
||||||
|
+ stderr=err_msg,
|
||||||
|
+ return_code=1,
|
||||||
|
+ )
|
||||||
|
+ self.env_assist.assert_raise_library_error(
|
||||||
|
+ lambda: scsi.unfence_node(
|
||||||
|
+ self.env_assist.get_env(),
|
||||||
|
+ self.node,
|
||||||
|
+ old_devices,
|
||||||
|
+ new_devices,
|
||||||
|
+ ),
|
||||||
|
+ [
|
||||||
|
+ fixture.error(
|
||||||
|
+ report_codes.STONITH_UNFENCING_DEVICE_STATUS_FAILED,
|
||||||
|
+ device=err_device,
|
||||||
|
+ reason=err_msg,
|
||||||
|
+ )
|
||||||
|
+ ],
|
||||||
|
+ expected_in_processor=False,
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+ def test_unfencing_skipped_devices_are_fenced(self):
|
||||||
|
+ stdout_off = "Status: OFF"
|
||||||
|
+ for old_dev in self.old_devices:
|
||||||
|
+ self.config.runner.scsi.get_status(
|
||||||
|
+ self.node,
|
||||||
|
+ old_dev,
|
||||||
|
+ name=f"runner.scsi.is_fenced.{old_dev}",
|
||||||
|
+ stdout=stdout_off,
|
||||||
|
+ return_code=2,
|
||||||
|
+ )
|
||||||
|
+ scsi.unfence_node(
|
||||||
|
+ self.env_assist.get_env(),
|
||||||
|
+ self.node,
|
||||||
|
+ self.old_devices,
|
||||||
|
+ self.new_devices,
|
||||||
|
+ )
|
||||||
|
+ self.env_assist.assert_reports(
|
||||||
|
+ [
|
||||||
|
+ fixture.info(
|
||||||
|
+ report_codes.STONITH_UNFENCING_SKIPPED_DEVICES_FENCED,
|
||||||
|
+ devices=sorted(self.old_devices),
|
||||||
|
+ )
|
||||||
|
+ ]
|
||||||
|
+ )
|
||||||
|
diff --git a/pcs_test/tier0/lib/commands/test_stonith_update_scsi_devices.py b/pcs_test/tier0/lib/commands/test_stonith_update_scsi_devices.py
|
||||||
|
index 6ff6b99a..ed8f5d4f 100644
|
||||||
|
--- a/pcs_test/tier0/lib/commands/test_stonith_update_scsi_devices.py
|
||||||
|
+++ b/pcs_test/tier0/lib/commands/test_stonith_update_scsi_devices.py
|
||||||
|
@@ -1,3 +1,4 @@
|
||||||
|
+# pylint: disable=too-many-lines
|
||||||
|
import json
|
||||||
|
from unittest import mock, TestCase
|
||||||
|
|
||||||
|
@@ -297,7 +298,9 @@ class UpdateScsiDevicesMixin:
|
||||||
|
node_labels=self.existing_nodes
|
||||||
|
)
|
||||||
|
self.config.http.scsi.unfence_node(
|
||||||
|
- unfence, node_labels=self.existing_nodes
|
||||||
|
+ original_devices=devices_before,
|
||||||
|
+ updated_devices=devices_updated,
|
||||||
|
+ node_labels=self.existing_nodes,
|
||||||
|
)
|
||||||
|
self.config.env.push_cib(
|
||||||
|
resources=fixture_scsi(
|
||||||
|
@@ -449,14 +452,14 @@ class UpdateScsiDevicesFailuresMixin:
|
||||||
|
node_labels=self.existing_nodes
|
||||||
|
)
|
||||||
|
self.config.http.scsi.unfence_node(
|
||||||
|
- DEVICES_2,
|
||||||
|
communication_list=[
|
||||||
|
dict(
|
||||||
|
label=self.existing_nodes[0],
|
||||||
|
raw_data=json.dumps(
|
||||||
|
dict(
|
||||||
|
- devices=[DEV_2],
|
||||||
|
node=self.existing_nodes[0],
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
was_connected=False,
|
||||||
|
@@ -466,8 +469,9 @@ class UpdateScsiDevicesFailuresMixin:
|
||||||
|
label=self.existing_nodes[1],
|
||||||
|
raw_data=json.dumps(
|
||||||
|
dict(
|
||||||
|
- devices=[DEV_2],
|
||||||
|
node=self.existing_nodes[1],
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
output=json.dumps(
|
||||||
|
@@ -491,8 +495,9 @@ class UpdateScsiDevicesFailuresMixin:
|
||||||
|
label=self.existing_nodes[2],
|
||||||
|
raw_data=json.dumps(
|
||||||
|
dict(
|
||||||
|
- devices=[DEV_2],
|
||||||
|
node=self.existing_nodes[2],
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
@@ -504,7 +509,7 @@ class UpdateScsiDevicesFailuresMixin:
|
||||||
|
fixture.error(
|
||||||
|
reports.codes.NODE_COMMUNICATION_ERROR_UNABLE_TO_CONNECT,
|
||||||
|
node=self.existing_nodes[0],
|
||||||
|
- command="api/v1/scsi-unfence-node/v1",
|
||||||
|
+ command="api/v1/scsi-unfence-node/v2",
|
||||||
|
reason="errA",
|
||||||
|
),
|
||||||
|
fixture.error(
|
||||||
|
@@ -517,20 +522,76 @@ class UpdateScsiDevicesFailuresMixin:
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
+ def test_unfence_failure_unknown_command(self):
|
||||||
|
+ self._unfence_failure_common_calls()
|
||||||
|
+ self.config.http.corosync.get_corosync_online_targets(
|
||||||
|
+ node_labels=self.existing_nodes
|
||||||
|
+ )
|
||||||
|
+ communication_list = [
|
||||||
|
+ dict(
|
||||||
|
+ label=node,
|
||||||
|
+ raw_data=json.dumps(
|
||||||
|
+ dict(
|
||||||
|
+ node=node,
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
+ )
|
||||||
|
+ ),
|
||||||
|
+ )
|
||||||
|
+ for node in self.existing_nodes[0:2]
|
||||||
|
+ ]
|
||||||
|
+ communication_list.append(
|
||||||
|
+ dict(
|
||||||
|
+ label=self.existing_nodes[2],
|
||||||
|
+ response_code=404,
|
||||||
|
+ raw_data=json.dumps(
|
||||||
|
+ dict(
|
||||||
|
+ node=self.existing_nodes[2],
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
+ )
|
||||||
|
+ ),
|
||||||
|
+ output=json.dumps(
|
||||||
|
+ dto.to_dict(
|
||||||
|
+ communication.dto.InternalCommunicationResultDto(
|
||||||
|
+ status=communication.const.COM_STATUS_UNKNOWN_CMD,
|
||||||
|
+ status_msg=(
|
||||||
|
+ "Unknown command '/api/v1/scsi-unfence-node/v2'"
|
||||||
|
+ ),
|
||||||
|
+ report_list=[],
|
||||||
|
+ data=None,
|
||||||
|
+ )
|
||||||
|
+ )
|
||||||
|
+ ),
|
||||||
|
+ ),
|
||||||
|
+ )
|
||||||
|
+ self.config.http.scsi.unfence_node(
|
||||||
|
+ communication_list=communication_list
|
||||||
|
+ )
|
||||||
|
+ self.env_assist.assert_raise_library_error(self.command())
|
||||||
|
+ self.env_assist.assert_reports(
|
||||||
|
+ [
|
||||||
|
+ fixture.error(
|
||||||
|
+ reports.codes.PCSD_VERSION_TOO_OLD,
|
||||||
|
+ node=self.existing_nodes[2],
|
||||||
|
+ ),
|
||||||
|
+ ]
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
def test_unfence_failure_agent_script_failed(self):
|
||||||
|
self._unfence_failure_common_calls()
|
||||||
|
self.config.http.corosync.get_corosync_online_targets(
|
||||||
|
node_labels=self.existing_nodes
|
||||||
|
)
|
||||||
|
self.config.http.scsi.unfence_node(
|
||||||
|
- DEVICES_2,
|
||||||
|
communication_list=[
|
||||||
|
dict(
|
||||||
|
label=self.existing_nodes[0],
|
||||||
|
raw_data=json.dumps(
|
||||||
|
dict(
|
||||||
|
- devices=[DEV_2],
|
||||||
|
node=self.existing_nodes[0],
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
@@ -538,8 +599,9 @@ class UpdateScsiDevicesFailuresMixin:
|
||||||
|
label=self.existing_nodes[1],
|
||||||
|
raw_data=json.dumps(
|
||||||
|
dict(
|
||||||
|
- devices=[DEV_2],
|
||||||
|
node=self.existing_nodes[1],
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
output=json.dumps(
|
||||||
|
@@ -563,8 +625,9 @@ class UpdateScsiDevicesFailuresMixin:
|
||||||
|
label=self.existing_nodes[2],
|
||||||
|
raw_data=json.dumps(
|
||||||
|
dict(
|
||||||
|
- devices=[DEV_2],
|
||||||
|
node=self.existing_nodes[2],
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
@@ -639,14 +702,14 @@ class UpdateScsiDevicesFailuresMixin:
|
||||||
|
]
|
||||||
|
)
|
||||||
|
self.config.http.scsi.unfence_node(
|
||||||
|
- DEVICES_2,
|
||||||
|
communication_list=[
|
||||||
|
dict(
|
||||||
|
label=self.existing_nodes[0],
|
||||||
|
raw_data=json.dumps(
|
||||||
|
dict(
|
||||||
|
- devices=[DEV_2],
|
||||||
|
node=self.existing_nodes[0],
|
||||||
|
+ original_devices=DEVICES_1,
|
||||||
|
+ updated_devices=DEVICES_2,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
diff --git a/pcs_test/tools/command_env/config_http_scsi.py b/pcs_test/tools/command_env/config_http_scsi.py
|
||||||
|
index 0e9f63af..7150eef9 100644
|
||||||
|
--- a/pcs_test/tools/command_env/config_http_scsi.py
|
||||||
|
+++ b/pcs_test/tools/command_env/config_http_scsi.py
|
||||||
|
@@ -14,7 +14,8 @@ class ScsiShortcuts:
|
||||||
|
|
||||||
|
def unfence_node(
|
||||||
|
self,
|
||||||
|
- devices,
|
||||||
|
+ original_devices=(),
|
||||||
|
+ updated_devices=(),
|
||||||
|
node_labels=None,
|
||||||
|
communication_list=None,
|
||||||
|
name="http.scsi.unfence_node",
|
||||||
|
@@ -22,7 +23,8 @@ class ScsiShortcuts:
|
||||||
|
"""
|
||||||
|
Create a calls for node unfencing
|
||||||
|
|
||||||
|
- list devices -- list of scsi devices
|
||||||
|
+ list original_devices -- list of scsi devices before an update
|
||||||
|
+ list updated_devices -- list of scsi devices after an update
|
||||||
|
list node_labels -- create success responses from these nodes
|
||||||
|
list communication_list -- use these custom responses
|
||||||
|
string name -- the key of this call
|
||||||
|
@@ -39,7 +41,13 @@ class ScsiShortcuts:
|
||||||
|
communication_list = [
|
||||||
|
dict(
|
||||||
|
label=node,
|
||||||
|
- raw_data=json.dumps(dict(devices=devices, node=node)),
|
||||||
|
+ raw_data=json.dumps(
|
||||||
|
+ dict(
|
||||||
|
+ node=node,
|
||||||
|
+ original_devices=original_devices,
|
||||||
|
+ updated_devices=updated_devices,
|
||||||
|
+ )
|
||||||
|
+ ),
|
||||||
|
)
|
||||||
|
for node in node_labels
|
||||||
|
]
|
||||||
|
@@ -47,7 +55,7 @@ class ScsiShortcuts:
|
||||||
|
self.__calls,
|
||||||
|
name,
|
||||||
|
communication_list,
|
||||||
|
- action="api/v1/scsi-unfence-node/v1",
|
||||||
|
+ action="api/v1/scsi-unfence-node/v2",
|
||||||
|
output=json.dumps(
|
||||||
|
to_dict(
|
||||||
|
communication.dto.InternalCommunicationResultDto(
|
||||||
|
diff --git a/pcs_test/tools/command_env/config_runner_scsi.py b/pcs_test/tools/command_env/config_runner_scsi.py
|
||||||
|
index 4b671bb7..3cee13d6 100644
|
||||||
|
--- a/pcs_test/tools/command_env/config_runner_scsi.py
|
||||||
|
+++ b/pcs_test/tools/command_env/config_runner_scsi.py
|
||||||
|
@@ -35,7 +35,41 @@ class ScsiShortcuts:
|
||||||
|
os.path.join(settings.fence_agent_binaries, "fence_scsi"),
|
||||||
|
"--action=on",
|
||||||
|
"--devices",
|
||||||
|
- ",".join(devices),
|
||||||
|
+ ",".join(sorted(devices)),
|
||||||
|
+ f"--plug={node}",
|
||||||
|
+ ],
|
||||||
|
+ stdout=stdout,
|
||||||
|
+ stderr=stderr,
|
||||||
|
+ returncode=return_code,
|
||||||
|
+ ),
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+ def get_status(
|
||||||
|
+ self,
|
||||||
|
+ node,
|
||||||
|
+ device,
|
||||||
|
+ stdout="",
|
||||||
|
+ stderr="",
|
||||||
|
+ return_code=0,
|
||||||
|
+ name="runner.scsi.is_fenced",
|
||||||
|
+ ):
|
||||||
|
+ """
|
||||||
|
+ Create a call for getting scsi status
|
||||||
|
+
|
||||||
|
+ string node -- a node from which is unfencing performed
|
||||||
|
+ str device -- a device to check
|
||||||
|
+ string stdout -- stdout from fence_scsi agent script
|
||||||
|
+ string stderr -- stderr from fence_scsi agent script
|
||||||
|
+ int return_code -- return code of the fence_scsi agent script
|
||||||
|
+ string name -- the key of this call
|
||||||
|
+ """
|
||||||
|
+ self.__calls.place(
|
||||||
|
+ name,
|
||||||
|
+ RunnerCall(
|
||||||
|
+ [
|
||||||
|
+ os.path.join(settings.fence_agent_binaries, "fence_scsi"),
|
||||||
|
+ "--action=status",
|
||||||
|
+ f"--devices={device}",
|
||||||
|
f"--plug={node}",
|
||||||
|
],
|
||||||
|
stdout=stdout,
|
||||||
|
diff --git a/pcsd/api_v1.rb b/pcsd/api_v1.rb
|
||||||
|
index 7edeeabf..e55c2be7 100644
|
||||||
|
--- a/pcsd/api_v1.rb
|
||||||
|
+++ b/pcsd/api_v1.rb
|
||||||
|
@@ -291,7 +291,7 @@ def route_api_v1(auth_user, params, request)
|
||||||
|
:only_superuser => false,
|
||||||
|
:permissions => Permissions::WRITE,
|
||||||
|
},
|
||||||
|
- 'scsi-unfence-node/v1' => {
|
||||||
|
+ 'scsi-unfence-node/v2' => {
|
||||||
|
:cmd => 'scsi.unfence_node',
|
||||||
|
:only_superuser => false,
|
||||||
|
:permissions => Permissions::WRITE,
|
||||||
|
diff --git a/pcsd/capabilities.xml b/pcsd/capabilities.xml
|
||||||
|
index 58ebcf0f..3954aa5d 100644
|
||||||
|
--- a/pcsd/capabilities.xml
|
||||||
|
+++ b/pcsd/capabilities.xml
|
||||||
|
@@ -1892,11 +1892,13 @@
|
||||||
|
pcs commands: stonith update-scsi-devices
|
||||||
|
</description>
|
||||||
|
</capability>
|
||||||
|
- <capability id="pcmk.stonith.scsi-unfence-node" in-pcs="0" in-pcsd="1">
|
||||||
|
+ <capability id="pcmk.stonith.scsi-unfence-node-v2" in-pcs="0" in-pcsd="1">
|
||||||
|
<description>
|
||||||
|
- Unfence scsi devices on a cluster node.
|
||||||
|
+ Unfence scsi devices on a cluster node. In comparison with v1, only
|
||||||
|
+ newly added devices are unfenced. In case any existing device is
|
||||||
|
+ fenced, unfencing will be skipped.
|
||||||
|
|
||||||
|
- daemon urls: /api/v1/scsi-unfence-node/v1
|
||||||
|
+ daemon urls: /api/v1/scsi-unfence-node/v2
|
||||||
|
</description>
|
||||||
|
</capability>
|
||||||
|
<capability id="pcmk.stonith.enable-disable" in-pcs="1" in-pcsd="1">
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,45 @@
|
|||||||
|
From 189c73e31f5033413fc4483e40d0bfc78d77f962 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Tomas Jelinek <tojeline@redhat.com>
|
||||||
|
Date: Fri, 27 Aug 2021 12:05:18 +0200
|
||||||
|
Subject: [PATCH 1/2] fix creating resources with depth operation attribute
|
||||||
|
|
||||||
|
---
|
||||||
|
CHANGELOG.md | 9 +++++++++
|
||||||
|
pcs/lib/cib/resource/operations.py | 2 +-
|
||||||
|
2 files changed, 10 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG.md b/CHANGELOG.md
|
||||||
|
index f768cc36..c15546ba 100644
|
||||||
|
--- a/CHANGELOG.md
|
||||||
|
+++ b/CHANGELOG.md
|
||||||
|
@@ -1,5 +1,14 @@
|
||||||
|
# Change Log
|
||||||
|
|
||||||
|
+## [Unreleased]
|
||||||
|
+
|
||||||
|
+### Fixed
|
||||||
|
+- Fixed an error when creating a resource which defines 'depth' attribute for
|
||||||
|
+ its operations ([rhbz#1998454])
|
||||||
|
+
|
||||||
|
+[rhbz#1998454]: https://bugzilla.redhat.com/show_bug.cgi?id=1998454
|
||||||
|
+
|
||||||
|
+
|
||||||
|
## [0.10.10] - 2021-08-19
|
||||||
|
|
||||||
|
### Added
|
||||||
|
diff --git a/pcs/lib/cib/resource/operations.py b/pcs/lib/cib/resource/operations.py
|
||||||
|
index 390db71a..44b2e7dd 100644
|
||||||
|
--- a/pcs/lib/cib/resource/operations.py
|
||||||
|
+++ b/pcs/lib/cib/resource/operations.py
|
||||||
|
@@ -197,7 +197,7 @@ def _action_dto_to_dict(
|
||||||
|
) -> Dict[str, str]:
|
||||||
|
result = dict(
|
||||||
|
filter(
|
||||||
|
- lambda item: item[0] != "deph" and item[1] not in (None, ""),
|
||||||
|
+ lambda item: item[0] != "depth" and item[1] not in (None, ""),
|
||||||
|
to_dict(dto).items(),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -1,19 +1,19 @@
|
|||||||
From ab9fd9f223e805247319ac5a7318c15417197a0a Mon Sep 17 00:00:00 2001
|
From e46d60cb36cb8ca4b153f75caa20b165945b1d26 Mon Sep 17 00:00:00 2001
|
||||||
From: Ivan Devat <idevat@redhat.com>
|
From: Ivan Devat <idevat@redhat.com>
|
||||||
Date: Tue, 20 Nov 2018 15:03:56 +0100
|
Date: Tue, 20 Nov 2018 15:03:56 +0100
|
||||||
Subject: [PATCH] do not support cluster setup with udp(u) transport
|
Subject: [PATCH 2/2] do not support cluster setup with udp(u) transport
|
||||||
|
|
||||||
---
|
---
|
||||||
pcs/pcs.8 | 2 ++
|
pcs/pcs.8.in | 2 ++
|
||||||
pcs/usage.py | 1 +
|
pcs/usage.py | 1 +
|
||||||
pcsd/public/css/style.css | 3 +++
|
pcsd/public/css/style.css | 3 +++
|
||||||
3 files changed, 6 insertions(+)
|
3 files changed, 6 insertions(+)
|
||||||
|
|
||||||
diff --git a/pcs/pcs.8 b/pcs/pcs.8
|
diff --git a/pcs/pcs.8.in b/pcs/pcs.8.in
|
||||||
index edfdd039..8caf087f 100644
|
index 1695d75c..80d165fc 100644
|
||||||
--- a/pcs/pcs.8
|
--- a/pcs/pcs.8.in
|
||||||
+++ b/pcs/pcs.8
|
+++ b/pcs/pcs.8.in
|
||||||
@@ -424,6 +424,8 @@ By default, encryption is enabled with cipher=aes256 and hash=sha256. To disable
|
@@ -429,6 +429,8 @@ By default, encryption is enabled with cipher=aes256 and hash=sha256. To disable
|
||||||
|
|
||||||
Transports udp and udpu:
|
Transports udp and udpu:
|
||||||
.br
|
.br
|
||||||
@ -23,10 +23,10 @@ index edfdd039..8caf087f 100644
|
|||||||
.br
|
.br
|
||||||
Transport options are: ip_version, netmtu
|
Transport options are: ip_version, netmtu
|
||||||
diff --git a/pcs/usage.py b/pcs/usage.py
|
diff --git a/pcs/usage.py b/pcs/usage.py
|
||||||
index baedb347..f576eaf2 100644
|
index 66e097f1..783d926d 100644
|
||||||
--- a/pcs/usage.py
|
--- a/pcs/usage.py
|
||||||
+++ b/pcs/usage.py
|
+++ b/pcs/usage.py
|
||||||
@@ -852,6 +852,7 @@ Commands:
|
@@ -872,6 +872,7 @@ Commands:
|
||||||
hash=sha256. To disable encryption, set cipher=none and hash=none.
|
hash=sha256. To disable encryption, set cipher=none and hash=none.
|
||||||
|
|
||||||
Transports udp and udpu:
|
Transports udp and udpu:
|
||||||
@ -35,7 +35,7 @@ index baedb347..f576eaf2 100644
|
|||||||
support traffic encryption nor compression.
|
support traffic encryption nor compression.
|
||||||
Transport options are:
|
Transport options are:
|
||||||
diff --git a/pcsd/public/css/style.css b/pcsd/public/css/style.css
|
diff --git a/pcsd/public/css/style.css b/pcsd/public/css/style.css
|
||||||
index b857cbae..b8d48d92 100644
|
index 2f26e831..a7702ac4 100644
|
||||||
--- a/pcsd/public/css/style.css
|
--- a/pcsd/public/css/style.css
|
||||||
+++ b/pcsd/public/css/style.css
|
+++ b/pcsd/public/css/style.css
|
||||||
@@ -949,6 +949,9 @@ table.args-table td.reg {
|
@@ -949,6 +949,9 @@ table.args-table td.reg {
|
||||||
@ -49,5 +49,5 @@ index b857cbae..b8d48d92 100644
|
|||||||
#csetup-transport-options.knet .without-knet
|
#csetup-transport-options.knet .without-knet
|
||||||
{
|
{
|
||||||
--
|
--
|
||||||
2.26.2
|
2.31.1
|
||||||
|
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
BUNDLE_FROZEN: '1'
|
|
||||||
BUNDLE_PATH: vendor/bundle
|
|
||||||
BUNDLE_DISABLE_SHARED_GEMS: '1'
|
|
||||||
BUNDLE_BUILD: --with-ldflags="-Wl,-z,now -Wl,-z,relro"
|
|
330
SPECS/pcs.spec
330
SPECS/pcs.spec
@ -1,6 +1,6 @@
|
|||||||
Name: pcs
|
Name: pcs
|
||||||
Version: 0.10.8
|
Version: 0.10.10
|
||||||
Release: 1%{?dist}
|
Release: 4%{?dist}
|
||||||
# https://docs.fedoraproject.org/en-US/packaging-guidelines/LicensingGuidelines/
|
# https://docs.fedoraproject.org/en-US/packaging-guidelines/LicensingGuidelines/
|
||||||
# https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses
|
# https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses
|
||||||
# GPLv2: pcs
|
# GPLv2: pcs
|
||||||
@ -20,13 +20,13 @@ Summary: Pacemaker Configuration System
|
|||||||
ExclusiveArch: i686 x86_64 s390x ppc64le aarch64
|
ExclusiveArch: i686 x86_64 s390x ppc64le aarch64
|
||||||
|
|
||||||
%global version_or_commit %{version}
|
%global version_or_commit %{version}
|
||||||
# %%global version_or_commit 508b3999eb02b4901e83b8e780af8422b522ad30
|
# %%global version_or_commit %%{version}.210-9862
|
||||||
|
|
||||||
%global pcs_source_name %{name}-%{version_or_commit}
|
%global pcs_source_name %{name}-%{version_or_commit}
|
||||||
|
|
||||||
# ui_commit can be determined by hash, tag or branch
|
# ui_commit can be determined by hash, tag or branch
|
||||||
%global ui_commit 0.1.5
|
%global ui_commit 0.1.7
|
||||||
%global ui_modules_version 0.1.5
|
%global ui_modules_version 0.1.7
|
||||||
%global ui_src_name pcs-web-ui-%{ui_commit}
|
%global ui_src_name pcs-web-ui-%{ui_commit}
|
||||||
|
|
||||||
%global pcs_snmp_pkg_name pcs-snmp
|
%global pcs_snmp_pkg_name pcs-snmp
|
||||||
@ -47,6 +47,7 @@ ExclusiveArch: i686 x86_64 s390x ppc64le aarch64
|
|||||||
%global version_rubygem_rack 2.2.3
|
%global version_rubygem_rack 2.2.3
|
||||||
%global version_rubygem_rack_protection 2.0.8.1
|
%global version_rubygem_rack_protection 2.0.8.1
|
||||||
%global version_rubygem_rack_test 1.1.0
|
%global version_rubygem_rack_test 1.1.0
|
||||||
|
%global version_rubygem_rexml 3.2.5
|
||||||
%global version_rubygem_ruby2_keywords 0.0.2
|
%global version_rubygem_ruby2_keywords 0.0.2
|
||||||
%global version_rubygem_sinatra 2.0.8.1
|
%global version_rubygem_sinatra 2.0.8.1
|
||||||
%global version_rubygem_thin 1.7.2
|
%global version_rubygem_thin 1.7.2
|
||||||
@ -55,20 +56,13 @@ ExclusiveArch: i686 x86_64 s390x ppc64le aarch64
|
|||||||
# javascript bundled libraries for old web-ui
|
# javascript bundled libraries for old web-ui
|
||||||
%global ember_version 1.4.0
|
%global ember_version 1.4.0
|
||||||
%global handlebars_version 1.2.1
|
%global handlebars_version 1.2.1
|
||||||
%global jquery_ui_version 1.10.1
|
%global jquery_ui_version 1.12.1
|
||||||
%global jquery_version 1.9.1
|
%global jquery_version 3.6.0
|
||||||
|
|
||||||
# We do not use _libdir macro because upstream is not prepared for it.
|
%global pcs_bundled_dir pcs_bundled
|
||||||
# Pcs does not include binaries and thus it should live in /usr/lib. Tornado
|
|
||||||
# and gems include binaries and thus it should live in /usr/lib64. But the
|
|
||||||
# path to tornado/gems is hardcoded in pcs sources. Modify hard links in pcs
|
|
||||||
# sources is not the way since then rpmdiff complains that the same file has
|
|
||||||
# different content in different architectures.
|
|
||||||
%global pcs_libdir %{_prefix}/lib
|
|
||||||
%global bundled_src_dir pcs/bundled
|
|
||||||
%global pcsd_public_dir pcsd/public
|
%global pcsd_public_dir pcsd/public
|
||||||
%global rubygem_cache_dir pcsd/vendor/cache
|
%global rubygem_bundle_dir pcsd/vendor/bundle
|
||||||
%global rubygem_bundle_dir pcsd/vendor/bundle/ruby
|
%global rubygem_cache_dir %{rubygem_bundle_dir}/cache
|
||||||
|
|
||||||
# mangling shebang in /usr/lib/pcsd/vendor/bundle/ruby/gems/rack-2.0.5/test/cgi/test from /usr/bin/env ruby to #!/usr/bin/ruby
|
# mangling shebang in /usr/lib/pcsd/vendor/bundle/ruby/gems/rack-2.0.5/test/cgi/test from /usr/bin/env ruby to #!/usr/bin/ruby
|
||||||
#*** ERROR: ./usr/lib/pcsd/vendor/bundle/ruby/gems/rack-2.0.5/test/cgi/test.ru has shebang which doesn't start with '/' (../../bin/rackup)
|
#*** ERROR: ./usr/lib/pcsd/vendor/bundle/ruby/gems/rack-2.0.5/test/cgi/test.ru has shebang which doesn't start with '/' (../../bin/rackup)
|
||||||
@ -87,7 +81,6 @@ ExclusiveArch: i686 x86_64 s390x ppc64le aarch64
|
|||||||
|
|
||||||
Source0: %{url}/archive/%{version_or_commit}/%{pcs_source_name}.tar.gz
|
Source0: %{url}/archive/%{version_or_commit}/%{pcs_source_name}.tar.gz
|
||||||
Source1: HAM-logo.png
|
Source1: HAM-logo.png
|
||||||
Source2: pcsd-bundle-config-2
|
|
||||||
|
|
||||||
Source41: https://github.com/ondrejmular/pyagentx/archive/v%{pyagentx_version}/pyagentx-%{pyagentx_version}.tar.gz
|
Source41: https://github.com/ondrejmular/pyagentx/archive/v%{pyagentx_version}/pyagentx-%{pyagentx_version}.tar.gz
|
||||||
Source42: https://github.com/tornadoweb/tornado/archive/v%{tornado_version}/tornado-%{tornado_version}.tar.gz
|
Source42: https://github.com/tornadoweb/tornado/archive/v%{tornado_version}/tornado-%{tornado_version}.tar.gz
|
||||||
@ -99,6 +92,7 @@ Source81: https://rubygems.org/downloads/backports-%{version_rubygem_backports}.
|
|||||||
Source82: https://rubygems.org/downloads/ethon-%{version_rubygem_ethon}.gem
|
Source82: https://rubygems.org/downloads/ethon-%{version_rubygem_ethon}.gem
|
||||||
Source83: https://rubygems.org/downloads/ffi-%{version_rubygem_ffi}.gem
|
Source83: https://rubygems.org/downloads/ffi-%{version_rubygem_ffi}.gem
|
||||||
Source84: https://rubygems.org/downloads/json-%{version_rubygem_json}.gem
|
Source84: https://rubygems.org/downloads/json-%{version_rubygem_json}.gem
|
||||||
|
Source85: https://rubygems.org/downloads/rexml-%{version_rubygem_rexml}.gem
|
||||||
Source86: https://rubygems.org/downloads/mustermann-%{version_rubygem_mustermann}.gem
|
Source86: https://rubygems.org/downloads/mustermann-%{version_rubygem_mustermann}.gem
|
||||||
# We needed to re-upload open4 rubygem because of issues with sources in gating.
|
# We needed to re-upload open4 rubygem because of issues with sources in gating.
|
||||||
# Unfortunately, there was no newer version available, therefore we had to
|
# Unfortunately, there was no newer version available, therefore we had to
|
||||||
@ -114,14 +108,18 @@ Source94: https://rubygems.org/downloads/daemons-%{version_rubygem_daemons}.gem
|
|||||||
Source95: https://rubygems.org/downloads/thin-%{version_rubygem_thin}.gem
|
Source95: https://rubygems.org/downloads/thin-%{version_rubygem_thin}.gem
|
||||||
Source96: https://rubygems.org/downloads/ruby2_keywords-%{version_rubygem_ruby2_keywords}.gem
|
Source96: https://rubygems.org/downloads/ruby2_keywords-%{version_rubygem_ruby2_keywords}.gem
|
||||||
|
|
||||||
Source100: https://github.com/idevat/pcs-web-ui/archive/%{ui_commit}/%{ui_src_name}.tar.gz
|
Source100: https://github.com/ClusterLabs/pcs-web-ui/archive/%{ui_commit}/%{ui_src_name}.tar.gz
|
||||||
Source101: https://github.com/idevat/pcs-web-ui/releases/download/%{ui_modules_version}/pcs-web-ui-node-modules-%{ui_modules_version}.tar.xz
|
Source101: https://github.com/ClusterLabs/pcs-web-ui/releases/download/%{ui_modules_version}/pcs-web-ui-node-modules-%{ui_modules_version}.tar.xz
|
||||||
|
|
||||||
# Patches from upstream.
|
# Patches from upstream.
|
||||||
# They should come before downstream patches to avoid unnecessary conflicts.
|
# They should come before downstream patches to avoid unnecessary conflicts.
|
||||||
# Z-streams are exception here: they can come from upstream but should be
|
# Z-streams are exception here: they can come from upstream but should be
|
||||||
# applied at the end to keep z-stream changes as straightforward as possible.
|
# applied at the end to keep z-stream changes as straightforward as possible.
|
||||||
# Patch1: bzNUMBER-01-name.patch
|
# Patch1: bzNUMBER-01-name.patch
|
||||||
|
Patch1: bz1998454-01-fix-creating-resources-with-depth-operation-attribut.patch
|
||||||
|
Patch2: add-missing-file-test_stonith_update_scsi_devices.py.patch
|
||||||
|
Patch3: bz1992668-01-add-add-remove-syntax-for-command-pcs-stonith-update.patch
|
||||||
|
Patch4: bz1991654-01-fix-unfencing-in-pcs-stonith-update-scsi-devices.patch
|
||||||
|
|
||||||
# Downstream patches do not come from upstream. They adapt pcs for specific
|
# Downstream patches do not come from upstream. They adapt pcs for specific
|
||||||
# RHEL needs.
|
# RHEL needs.
|
||||||
@ -136,7 +134,12 @@ BuildRequires: platform-python
|
|||||||
BuildRequires: python3-devel
|
BuildRequires: python3-devel
|
||||||
BuildRequires: platform-python-setuptools
|
BuildRequires: platform-python-setuptools
|
||||||
BuildRequires: python3-pycurl
|
BuildRequires: python3-pycurl
|
||||||
|
BuildRequires: python3-pip
|
||||||
BuildRequires: python3-pyparsing
|
BuildRequires: python3-pyparsing
|
||||||
|
BuildRequires: python3-cryptography
|
||||||
|
BuildRequires: python3-lxml
|
||||||
|
# for building bundled python packages
|
||||||
|
BuildRequires: python3-wheel
|
||||||
# for bundled python dateutil
|
# for bundled python dateutil
|
||||||
BuildRequires: python3-setuptools_scm
|
BuildRequires: python3-setuptools_scm
|
||||||
# gcc for compiling custom rubygems
|
# gcc for compiling custom rubygems
|
||||||
@ -146,15 +149,13 @@ BuildRequires: gcc-c++
|
|||||||
BuildRequires: ruby >= 2.2.0
|
BuildRequires: ruby >= 2.2.0
|
||||||
BuildRequires: ruby-devel
|
BuildRequires: ruby-devel
|
||||||
BuildRequires: rubygems
|
BuildRequires: rubygems
|
||||||
|
BuildRequires: rubygem-bundler
|
||||||
# ruby libraries for tests
|
# ruby libraries for tests
|
||||||
BuildRequires: rubygem-test-unit
|
BuildRequires: rubygem-test-unit
|
||||||
# for touching patch files (sanitization function)
|
# for touching patch files (sanitization function)
|
||||||
BuildRequires: diffstat
|
BuildRequires: diffstat
|
||||||
# for post, preun and postun macros
|
# for post, preun and postun macros
|
||||||
BuildRequires: systemd
|
BuildRequires: systemd
|
||||||
# for tests
|
|
||||||
BuildRequires: python3-lxml
|
|
||||||
BuildRequires: python3-pyOpenSSL
|
|
||||||
# pcsd fonts and font management tools for creating symlinks to fonts
|
# pcsd fonts and font management tools for creating symlinks to fonts
|
||||||
BuildRequires: fontconfig
|
BuildRequires: fontconfig
|
||||||
BuildRequires: liberation-sans-fonts
|
BuildRequires: liberation-sans-fonts
|
||||||
@ -166,6 +167,15 @@ BuildRequires: redhat-logos
|
|||||||
# for building web ui
|
# for building web ui
|
||||||
BuildRequires: npm
|
BuildRequires: npm
|
||||||
|
|
||||||
|
# cluster stack packages for pkg-config
|
||||||
|
BuildRequires: booth
|
||||||
|
BuildRequires: corosync-qdevice-devel
|
||||||
|
BuildRequires: corosynclib-devel >= 3.0
|
||||||
|
BuildRequires: fence-agents-common
|
||||||
|
BuildRequires: pacemaker-libs-devel >= 2.0.0
|
||||||
|
BuildRequires: resource-agents
|
||||||
|
BuildRequires: sbd
|
||||||
|
|
||||||
# python and libraries for pcs, setuptools for pcs entrypoint
|
# python and libraries for pcs, setuptools for pcs entrypoint
|
||||||
Requires: platform-python
|
Requires: platform-python
|
||||||
Requires: python3-lxml
|
Requires: python3-lxml
|
||||||
@ -173,14 +183,12 @@ Requires: platform-python-setuptools
|
|||||||
Requires: python3-clufter => 0.70.0
|
Requires: python3-clufter => 0.70.0
|
||||||
Requires: python3-pycurl
|
Requires: python3-pycurl
|
||||||
Requires: python3-pyparsing
|
Requires: python3-pyparsing
|
||||||
|
Requires: python3-cryptography
|
||||||
# ruby and gems for pcsd
|
# ruby and gems for pcsd
|
||||||
Requires: ruby >= 2.2.0
|
Requires: ruby >= 2.2.0
|
||||||
Requires: rubygems
|
Requires: rubygems
|
||||||
# for killall
|
# for killall
|
||||||
Requires: psmisc
|
Requires: psmisc
|
||||||
# for working with certificates (validation etc.)
|
|
||||||
Requires: openssl
|
|
||||||
Requires: python3-pyOpenSSL
|
|
||||||
# cluster stack and related packages
|
# cluster stack and related packages
|
||||||
Requires: pcmk-cluster-manager >= 2.0.0
|
Requires: pcmk-cluster-manager >= 2.0.0
|
||||||
Suggests: pacemaker
|
Suggests: pacemaker
|
||||||
@ -218,6 +226,7 @@ Provides: bundled(open4) = %{version_rubygem_open4}
|
|||||||
Provides: bundled(rack) = %{version_rubygem_rack}
|
Provides: bundled(rack) = %{version_rubygem_rack}
|
||||||
Provides: bundled(rack_protection) = %{version_rubygem_rack_protection}
|
Provides: bundled(rack_protection) = %{version_rubygem_rack_protection}
|
||||||
Provides: bundled(rack_test) = %{version_rubygem_rack_test}
|
Provides: bundled(rack_test) = %{version_rubygem_rack_test}
|
||||||
|
Provides: bundled(rexml) = %{version_rubygem_rexml}
|
||||||
Provides: bundled(ruby2_keywords) = %{version_rubygem_ruby2_keywords}
|
Provides: bundled(ruby2_keywords) = %{version_rubygem_ruby2_keywords}
|
||||||
Provides: bundled(sinatra) = %{version_rubygem_sinatra}
|
Provides: bundled(sinatra) = %{version_rubygem_sinatra}
|
||||||
Provides: bundled(thin) = %{version_rubygem_thin}
|
Provides: bundled(thin) = %{version_rubygem_thin}
|
||||||
@ -297,10 +306,13 @@ update_times_patch(){
|
|||||||
update_times ${patch_file_name} `diffstat -p1 -l ${patch_file_name}`
|
update_times ${patch_file_name} `diffstat -p1 -l ${patch_file_name}`
|
||||||
}
|
}
|
||||||
|
|
||||||
# update_times_patch %%{PATCH1}
|
update_times_patch %{PATCH1}
|
||||||
|
update_times_patch %{PATCH2}
|
||||||
|
update_times_patch %{PATCH3}
|
||||||
|
update_times_patch %{PATCH4}
|
||||||
update_times_patch %{PATCH101}
|
update_times_patch %{PATCH101}
|
||||||
|
|
||||||
cp -f %SOURCE1 pcsd/public/images
|
cp -f %SOURCE1 %{pcsd_public_dir}/images
|
||||||
# prepare dirs/files necessary for building web ui
|
# prepare dirs/files necessary for building web ui
|
||||||
# inside SOURCE100 is only directory %%{ui_src_name}
|
# inside SOURCE100 is only directory %%{ui_src_name}
|
||||||
tar -xzf %SOURCE100 -C %{pcsd_public_dir}
|
tar -xzf %SOURCE100 -C %{pcsd_public_dir}
|
||||||
@ -308,104 +320,54 @@ tar -xf %SOURCE101 -C %{pcsd_public_dir}/%{ui_src_name}
|
|||||||
|
|
||||||
# prepare dirs/files necessary for building all bundles
|
# prepare dirs/files necessary for building all bundles
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
# 1) configuration for rubygems
|
# 1) rubygems sources
|
||||||
mkdir -p pcsd/.bundle
|
|
||||||
cp -f %SOURCE2 pcsd/.bundle/config
|
|
||||||
|
|
||||||
# 2) rubygems sources
|
mkdir -p %{rubygem_cache_dir}
|
||||||
mkdir -p pcsd/vendor/cache
|
cp -f %SOURCE81 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE81 pcsd/vendor/cache
|
cp -f %SOURCE82 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE82 pcsd/vendor/cache
|
cp -f %SOURCE83 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE83 pcsd/vendor/cache
|
cp -f %SOURCE84 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE84 pcsd/vendor/cache
|
cp -f %SOURCE85 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE86 pcsd/vendor/cache
|
cp -f %SOURCE86 %{rubygem_cache_dir}
|
||||||
# For reason why we are renaming open4 rubygem, see comment of source
|
# For reason why we are renaming open4 rubygem, see comment of source
|
||||||
# definition above.
|
# definition above.
|
||||||
cp -f %SOURCE87 pcsd/vendor/cache/open4-%{version_rubygem_open4}.gem
|
cp -f %SOURCE87 %{rubygem_cache_dir}/open4-%{version_rubygem_open4}.gem
|
||||||
cp -f %SOURCE88 pcsd/vendor/cache
|
cp -f %SOURCE88 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE89 pcsd/vendor/cache
|
cp -f %SOURCE89 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE90 pcsd/vendor/cache
|
cp -f %SOURCE90 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE91 pcsd/vendor/cache
|
cp -f %SOURCE91 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE92 pcsd/vendor/cache
|
cp -f %SOURCE92 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE93 pcsd/vendor/cache
|
cp -f %SOURCE93 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE94 pcsd/vendor/cache
|
cp -f %SOURCE94 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE95 pcsd/vendor/cache
|
cp -f %SOURCE95 %{rubygem_cache_dir}
|
||||||
cp -f %SOURCE96 pcsd/vendor/cache
|
cp -f %SOURCE96 %{rubygem_cache_dir}
|
||||||
|
|
||||||
|
|
||||||
# 3) dir for python bundles
|
# 2) prepare python bundles
|
||||||
mkdir -p %{bundled_src_dir}
|
mkdir -p %{pcs_bundled_dir}/src
|
||||||
|
cp -f %SOURCE41 rpm/
|
||||||
# 4) sources for pyagentx
|
cp -f %SOURCE42 rpm/
|
||||||
tar -xzf %SOURCE41 -C %{bundled_src_dir}
|
cp -f %SOURCE43 rpm/
|
||||||
mv %{bundled_src_dir}/pyagentx-%{pyagentx_version} %{bundled_src_dir}/pyagentx
|
cp -f %SOURCE44 rpm/
|
||||||
update_times %SOURCE41 `find %{bundled_src_dir}/pyagentx -follow`
|
cp -f %SOURCE45 rpm/
|
||||||
cp %{bundled_src_dir}/pyagentx/LICENSE.txt pyagentx_LICENSE.txt
|
|
||||||
cp %{bundled_src_dir}/pyagentx/CONTRIBUTORS.txt pyagentx_CONTRIBUTORS.txt
|
|
||||||
cp %{bundled_src_dir}/pyagentx/README.md pyagentx_README.md
|
|
||||||
|
|
||||||
# 5) sources for tornado
|
|
||||||
tar -xzf %SOURCE42 -C %{bundled_src_dir}
|
|
||||||
mv %{bundled_src_dir}/tornado-%{tornado_version} %{bundled_src_dir}/tornado
|
|
||||||
update_times %SOURCE42 `find %{bundled_src_dir}/tornado -follow`
|
|
||||||
cp %{bundled_src_dir}/tornado/LICENSE tornado_LICENSE
|
|
||||||
cp %{bundled_src_dir}/tornado/README.rst tornado_README.rst
|
|
||||||
|
|
||||||
# 6) sources for python dataclasses
|
|
||||||
tar -xzf %SOURCE43 -C %{bundled_src_dir}
|
|
||||||
mv %{bundled_src_dir}/dataclasses-%{dataclasses_version} %{bundled_src_dir}/dataclasses
|
|
||||||
update_times %SOURCE43 `find %{bundled_src_dir}/dataclasses -follow`
|
|
||||||
cp %{bundled_src_dir}/dataclasses/LICENSE.txt dataclasses_LICENSE.txt
|
|
||||||
cp %{bundled_src_dir}/dataclasses/README.rst dataclasses_README.rst
|
|
||||||
|
|
||||||
# 7) sources for python dacite
|
|
||||||
tar -xzf %SOURCE44 -C %{bundled_src_dir}
|
|
||||||
mv %{bundled_src_dir}/dacite-%{dacite_version} %{bundled_src_dir}/dacite
|
|
||||||
update_times %SOURCE44 `find %{bundled_src_dir}/dacite -follow`
|
|
||||||
cp %{bundled_src_dir}/dacite/LICENSE dacite_LICENSE
|
|
||||||
cp %{bundled_src_dir}/dacite/README.md dacite_README.md
|
|
||||||
|
|
||||||
# 8) sources for python dateutil
|
|
||||||
tar -xzf %SOURCE45 -C %{bundled_src_dir}
|
|
||||||
mv %{bundled_src_dir}/python-dateutil-%{dateutil_version} %{bundled_src_dir}/python-dateutil
|
|
||||||
update_times %SOURCE45 `find %{bundled_src_dir}/python-dateutil -follow`
|
|
||||||
cp %{bundled_src_dir}/python-dateutil/LICENSE dateutil_LICENSE
|
|
||||||
cp %{bundled_src_dir}/python-dateutil/README.rst dateutil_README.rst
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%define debug_package %{nil}
|
%define debug_package %{nil}
|
||||||
|
|
||||||
|
./autogen.sh
|
||||||
|
%{configure} --enable-local-build --enable-use-local-cache-only --enable-individual-bundling PYTHON=%{__python3}
|
||||||
|
make all
|
||||||
|
|
||||||
%install
|
%install
|
||||||
rm -rf $RPM_BUILD_ROOT
|
rm -rf $RPM_BUILD_ROOT
|
||||||
pwd
|
pwd
|
||||||
|
|
||||||
# build bundled rubygems (in main install it is disabled by BUILD_GEMS=false)
|
%make_install
|
||||||
mkdir -p %{rubygem_bundle_dir}
|
|
||||||
# The '-g' cflags option is needed for generation of MiniDebugInfo for shared
|
# build web ui and put it to pcsd
|
||||||
# libraries from rubygem extensions
|
make -C %{pcsd_public_dir}/%{ui_src_name} build
|
||||||
# Currently used rubygems with extensions: eventmachine, ffi, json, thin
|
mv %{pcsd_public_dir}/%{ui_src_name}/build ${RPM_BUILD_ROOT}%{_libdir}/%{pcsd_public_dir}/ui
|
||||||
# There was rpmdiff issue with missing .gnu_debugdata section
|
rm -r %{pcsd_public_dir}/%{ui_src_name}
|
||||||
# see https://docs.engineering.redhat.com/display/HTD/rpmdiff-elf-stripping
|
|
||||||
gem install \
|
|
||||||
--force --verbose --no-rdoc --no-ri -l --no-user-install \
|
|
||||||
-i %{rubygem_bundle_dir} \
|
|
||||||
%{rubygem_cache_dir}/backports-%{version_rubygem_backports}.gem \
|
|
||||||
%{rubygem_cache_dir}/daemons-%{version_rubygem_daemons}.gem \
|
|
||||||
%{rubygem_cache_dir}/ethon-%{version_rubygem_ethon}.gem \
|
|
||||||
%{rubygem_cache_dir}/eventmachine-%{version_rubygem_eventmachine}.gem \
|
|
||||||
%{rubygem_cache_dir}/ffi-%{version_rubygem_ffi}.gem \
|
|
||||||
%{rubygem_cache_dir}/json-%{version_rubygem_json}.gem \
|
|
||||||
%{rubygem_cache_dir}/mustermann-%{version_rubygem_mustermann}.gem \
|
|
||||||
%{rubygem_cache_dir}/open4-%{version_rubygem_open4}.gem \
|
|
||||||
%{rubygem_cache_dir}/rack-protection-%{version_rubygem_rack_protection}.gem \
|
|
||||||
%{rubygem_cache_dir}/rack-test-%{version_rubygem_rack_test}.gem \
|
|
||||||
%{rubygem_cache_dir}/rack-%{version_rubygem_rack}.gem \
|
|
||||||
%{rubygem_cache_dir}/ruby2_keywords-%{version_rubygem_ruby2_keywords}.gem \
|
|
||||||
%{rubygem_cache_dir}/sinatra-%{version_rubygem_sinatra}.gem \
|
|
||||||
%{rubygem_cache_dir}/thin-%{version_rubygem_thin}.gem \
|
|
||||||
%{rubygem_cache_dir}/tilt-%{version_rubygem_tilt}.gem \
|
|
||||||
-- '--with-ldflags="-Wl,-z,relro -Wl,-z,ibt -Wl,-z,now -Wl,--gc-sections"' \
|
|
||||||
'--with-cflags="-g -O2 -ffunction-sections"'
|
|
||||||
|
|
||||||
# prepare license files
|
# prepare license files
|
||||||
# some rubygems do not have a license file (ruby2_keywords, thin)
|
# some rubygems do not have a license file (ruby2_keywords, thin)
|
||||||
@ -426,36 +388,25 @@ mv %{rubygem_bundle_dir}/gems/rack-test-%{version_rubygem_rack_test}/MIT-LICENSE
|
|||||||
mv %{rubygem_bundle_dir}/gems/sinatra-%{version_rubygem_sinatra}/LICENSE sinatra_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/tilt-%{version_rubygem_tilt}/COPYING tilt_COPYING
|
||||||
|
|
||||||
# build web ui and put it to pcsd
|
|
||||||
make -C %{pcsd_public_dir}/%{ui_src_name} build
|
|
||||||
mv %{pcsd_public_dir}/%{ui_src_name}/build pcsd/public/ui
|
|
||||||
rm -r %{pcsd_public_dir}/%{ui_src_name}
|
|
||||||
|
|
||||||
# main pcs install
|
|
||||||
make install \
|
|
||||||
DESTDIR=$RPM_BUILD_ROOT \
|
|
||||||
PREFIX=%{_prefix} \
|
|
||||||
SYSTEMD_UNIT_DIR=%{_unitdir} \
|
|
||||||
LIB_DIR=%{pcs_libdir} \
|
|
||||||
PYTHON=%{__python3} \
|
|
||||||
PYTHON_SITELIB=%{python3_sitelib} \
|
|
||||||
BASH_COMPLETION_DIR=%{_datadir}/bash-completion/completions \
|
|
||||||
BUNDLE_PYAGENTX_SRC_DIR=`readlink -f %{bundled_src_dir}/pyagentx` \
|
|
||||||
BUNDLE_TORNADO_SRC_DIR=`readlink -f %{bundled_src_dir}/tornado` \
|
|
||||||
BUNDLE_DACITE_SRC_DIR=`readlink -f %{bundled_src_dir}/dacite` \
|
|
||||||
BUNDLE_DATEUTIL_SRC_DIR=`readlink -f %{bundled_src_dir}/python-dateutil` \
|
|
||||||
BUNDLE_DATACLASSES_SRC_DIR=`readlink -f %{bundled_src_dir}/dataclasses` \
|
|
||||||
BUILD_GEMS=false \
|
|
||||||
SYSTEMCTL_OVERRIDE=true \
|
|
||||||
hdrdir="%{_includedir}" \
|
|
||||||
rubyhdrdir="%{_includedir}" \
|
|
||||||
includedir="%{_includedir}"
|
|
||||||
|
|
||||||
# symlink favicon into pcsd directories
|
# symlink favicon into pcsd directories
|
||||||
ln -fs /etc/favicon.png ${RPM_BUILD_ROOT}%{pcs_libdir}/%{pcsd_public_dir}/images/favicon.png
|
ln -fs /etc/favicon.png ${RPM_BUILD_ROOT}%{_libdir}/%{pcsd_public_dir}/images/favicon.png
|
||||||
|
|
||||||
#after the ruby gem compilation we do not need ruby gems in the cache
|
|
||||||
rm -r -v $RPM_BUILD_ROOT%{pcs_libdir}/%{rubygem_cache_dir}
|
cp %{pcs_bundled_dir}/src/pyagentx-*/LICENSE.txt pyagentx_LICENSE.txt
|
||||||
|
cp %{pcs_bundled_dir}/src/pyagentx-*/CONTRIBUTORS.txt pyagentx_CONTRIBUTORS.txt
|
||||||
|
cp %{pcs_bundled_dir}/src/pyagentx-*/README.md pyagentx_README.md
|
||||||
|
|
||||||
|
cp %{pcs_bundled_dir}/src/tornado-*/LICENSE tornado_LICENSE
|
||||||
|
cp %{pcs_bundled_dir}/src/tornado-*/README.rst tornado_README.rst
|
||||||
|
|
||||||
|
cp %{pcs_bundled_dir}/src/dataclasses-*/LICENSE.txt dataclasses_LICENSE.txt
|
||||||
|
cp %{pcs_bundled_dir}/src/dataclasses-*/README.rst dataclasses_README.rst
|
||||||
|
|
||||||
|
cp %{pcs_bundled_dir}/src/dacite-*/LICENSE dacite_LICENSE
|
||||||
|
cp %{pcs_bundled_dir}/src/dacite-*/README.md dacite_README.md
|
||||||
|
|
||||||
|
cp %{pcs_bundled_dir}/src/python-dateutil-*/LICENSE dateutil_LICENSE
|
||||||
|
cp %{pcs_bundled_dir}/src/python-dateutil-*/README.rst dateutil_README.rst
|
||||||
|
|
||||||
# We are not building debug package for pcs but we need to add MiniDebuginfo
|
# 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
|
# to the bundled shared libraries from rubygem extensions in order to satisfy
|
||||||
@ -465,14 +416,15 @@ rm -r -v $RPM_BUILD_ROOT%{pcs_libdir}/%{rubygem_cache_dir}
|
|||||||
/usr/lib/rpm/find-debuginfo.sh -j2 -m -i -S debugsourcefiles.list
|
/usr/lib/rpm/find-debuginfo.sh -j2 -m -i -S debugsourcefiles.list
|
||||||
# find-debuginfo.sh generated some files into /usr/lib/debug and
|
# find-debuginfo.sh generated some files into /usr/lib/debug and
|
||||||
# /usr/src/debug/ that we don't want in the package
|
# /usr/src/debug/ that we don't want in the package
|
||||||
rm -rf $RPM_BUILD_ROOT%{pcs_libdir}/debug
|
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 $RPM_BUILD_ROOT%{_prefix}/src/debug
|
||||||
|
|
||||||
# We can remove files required for gem compilation
|
# We can remove files required for gem compilation
|
||||||
rm -rf $RPM_BUILD_ROOT%{pcs_libdir}/%{rubygem_bundle_dir}/gems/eventmachine-%{version_rubygem_eventmachine}/ext
|
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/eventmachine-%{version_rubygem_eventmachine}/ext
|
||||||
rm -rf $RPM_BUILD_ROOT%{pcs_libdir}/%{rubygem_bundle_dir}/gems/ffi-%{version_rubygem_ffi}/ext
|
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/ffi-%{version_rubygem_ffi}/ext
|
||||||
rm -rf $RPM_BUILD_ROOT%{pcs_libdir}/%{rubygem_bundle_dir}/gems/json-%{version_rubygem_json}/ext
|
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/json-%{version_rubygem_json}/ext
|
||||||
rm -rf $RPM_BUILD_ROOT%{pcs_libdir}/%{rubygem_bundle_dir}/gems/thin-%{version_rubygem_thin}/ext
|
rm -rf $RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir}/gems/thin-%{version_rubygem_thin}/ext
|
||||||
|
|
||||||
%check
|
%check
|
||||||
# In the building environment LC_CTYPE is set to C which causes tests to fail
|
# In the building environment LC_CTYPE is set to C which causes tests to fail
|
||||||
@ -495,8 +447,7 @@ run_all_tests(){
|
|||||||
# passing outside the mock environment.
|
# passing outside the mock environment.
|
||||||
# TODO: Investigate the issue
|
# TODO: Investigate the issue
|
||||||
|
|
||||||
BUNDLED_LIB_LOCATION=$RPM_BUILD_ROOT%{pcs_libdir}/pcs/bundled/packages \
|
%{__python3} pcs_test/suite --tier0 -v --vanilla --all-but \
|
||||||
%{__python3} pcs_test/suite.py --tier0 -v --vanilla --all-but \
|
|
||||||
pcs_test.tier0.lib.commands.test_resource_agent.DescribeAgentUtf8.test_describe \
|
pcs_test.tier0.lib.commands.test_resource_agent.DescribeAgentUtf8.test_describe \
|
||||||
pcs_test.tier0.daemon.app.test_app_remote.SyncConfigMutualExclusive.test_get_not_locked \
|
pcs_test.tier0.daemon.app.test_app_remote.SyncConfigMutualExclusive.test_get_not_locked \
|
||||||
pcs_test.tier0.daemon.app.test_app_remote.SyncConfigMutualExclusive.test_post_not_locked \
|
pcs_test.tier0.daemon.app.test_app_remote.SyncConfigMutualExclusive.test_post_not_locked \
|
||||||
@ -504,11 +455,10 @@ run_all_tests(){
|
|||||||
test_result_python=$?
|
test_result_python=$?
|
||||||
|
|
||||||
#run pcsd tests and remove them
|
#run pcsd tests and remove them
|
||||||
pcsd_dir=$RPM_BUILD_ROOT%{pcs_libdir}/pcsd
|
GEM_HOME=$RPM_BUILD_ROOT%{_libdir}/%{rubygem_bundle_dir} ruby \
|
||||||
GEM_HOME=$RPM_BUILD_ROOT%{pcs_libdir}/%{rubygem_bundle_dir} ruby \
|
-I$RPM_BUILD_ROOT%{_libdir}/pcsd \
|
||||||
-I${pcsd_dir} \
|
-Ipcsd/test \
|
||||||
-I${pcsd_dir}/test \
|
pcsd/test/test_all_suite.rb
|
||||||
${pcsd_dir}/test/test_all_suite.rb
|
|
||||||
test_result_ruby=$?
|
test_result_ruby=$?
|
||||||
|
|
||||||
if [ $test_result_python -ne 0 ]; then
|
if [ $test_result_python -ne 0 ]; then
|
||||||
@ -518,12 +468,8 @@ run_all_tests(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
remove_all_tests() {
|
remove_all_tests() {
|
||||||
pcsd_dir=$RPM_BUILD_ROOT%{pcs_libdir}/pcsd
|
|
||||||
#remove pcsd tests, we do not distribute them in the rpm
|
|
||||||
rm -r -v ${pcsd_dir}/test
|
|
||||||
|
|
||||||
# remove javascript testing files
|
# remove javascript testing files
|
||||||
rm -r -v ${pcsd_dir}/public/js/dev
|
rm -r -v $RPM_BUILD_ROOT%{_libdir}/%{pcsd_public_dir}/js/dev
|
||||||
}
|
}
|
||||||
|
|
||||||
run_all_tests
|
run_all_tests
|
||||||
@ -587,19 +533,11 @@ remove_all_tests
|
|||||||
%license rack-test_MIT-LICENSE.txt
|
%license rack-test_MIT-LICENSE.txt
|
||||||
%license sinatra_LICENSE
|
%license sinatra_LICENSE
|
||||||
%license tilt_COPYING
|
%license tilt_COPYING
|
||||||
%{python3_sitelib}/pcs
|
%{python3_sitelib}/*
|
||||||
%{python3_sitelib}/pcs-%{version}-py3.*.egg-info
|
|
||||||
%{_sbindir}/pcs
|
%{_sbindir}/pcs
|
||||||
%{_sbindir}/pcsd
|
%{_sbindir}/pcsd
|
||||||
%{pcs_libdir}/pcs/pcs_internal
|
%{_libdir}/pcs/*
|
||||||
%{pcs_libdir}/pcsd/*
|
%{_libdir}/pcsd/*
|
||||||
%{pcs_libdir}/pcsd/.bundle/config
|
|
||||||
%{pcs_libdir}/pcs/bundled/packages/tornado*
|
|
||||||
%{pcs_libdir}/pcs/bundled/packages/dacite*
|
|
||||||
%{pcs_libdir}/pcs/bundled/packages/dataclasses*
|
|
||||||
%{pcs_libdir}/pcs/bundled/packages/dateutil*
|
|
||||||
%{pcs_libdir}/pcs/bundled/packages/python_dateutil*
|
|
||||||
%{pcs_libdir}/pcs/bundled/packages/__pycache__/dataclasses.cpython-36.pyc
|
|
||||||
%{_unitdir}/pcsd.service
|
%{_unitdir}/pcsd.service
|
||||||
%{_unitdir}/pcsd-ruby.service
|
%{_unitdir}/pcsd-ruby.service
|
||||||
%{_datadir}/bash-completion/completions/pcs
|
%{_datadir}/bash-completion/completions/pcs
|
||||||
@ -617,22 +555,13 @@ remove_all_tests
|
|||||||
%ghost %config(noreplace) %attr(0644,root,root) %{_sharedstatedir}/pcsd/pcs_users.conf
|
%ghost %config(noreplace) %attr(0644,root,root) %{_sharedstatedir}/pcsd/pcs_users.conf
|
||||||
%{_mandir}/man8/pcs.*
|
%{_mandir}/man8/pcs.*
|
||||||
%{_mandir}/man8/pcsd.*
|
%{_mandir}/man8/pcsd.*
|
||||||
%exclude %{pcs_libdir}/pcsd/*.debian
|
%exclude %{_libdir}/pcs/pcs_snmp_agent
|
||||||
%exclude %{pcs_libdir}/pcsd/pcsd.service
|
%exclude %{_libdir}/pcs/%{pcs_bundled_dir}/packages/pyagentx*
|
||||||
%exclude %{pcs_libdir}/pcsd/pcsd-ruby.service
|
|
||||||
%exclude %{pcs_libdir}/pcsd/pcsd.conf
|
|
||||||
%exclude %{pcs_libdir}/pcsd/pcsd.8
|
|
||||||
%exclude %{pcs_libdir}/pcsd/public/js/dev/*
|
|
||||||
%exclude %{pcs_libdir}/pcsd/Gemfile
|
|
||||||
%exclude %{pcs_libdir}/pcsd/Gemfile.lock
|
|
||||||
%exclude %{pcs_libdir}/pcsd/Makefile
|
|
||||||
%exclude %{python3_sitelib}/pcs/bash_completion
|
|
||||||
%exclude %{python3_sitelib}/pcs/pcs.8
|
|
||||||
%exclude %{python3_sitelib}/pcs/pcs
|
|
||||||
|
|
||||||
%files -n %{pcs_snmp_pkg_name}
|
%files -n %{pcs_snmp_pkg_name}
|
||||||
%{pcs_libdir}/pcs/pcs_snmp_agent
|
%{_libdir}/pcs/pcs_snmp_agent
|
||||||
%{pcs_libdir}/pcs/bundled/packages/pyagentx*
|
%{_libdir}/pcs/%{pcs_bundled_dir}/packages/pyagentx*
|
||||||
%{_unitdir}/pcs_snmp_agent.service
|
%{_unitdir}/pcs_snmp_agent.service
|
||||||
%{_datadir}/snmp/mibs/PCMK-PCS*-MIB.txt
|
%{_datadir}/snmp/mibs/PCMK-PCS*-MIB.txt
|
||||||
%{_mandir}/man8/pcs_snmp_agent.*
|
%{_mandir}/man8/pcs_snmp_agent.*
|
||||||
@ -644,6 +573,41 @@ remove_all_tests
|
|||||||
%license pyagentx_LICENSE.txt
|
%license pyagentx_LICENSE.txt
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Sep 24 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.10-4
|
||||||
|
- Fixed unfencing in `pcs stonith update-scsi-devices`
|
||||||
|
- Resolves: rhbz#bz1991654
|
||||||
|
|
||||||
|
* Fri Sep 10 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.10-3
|
||||||
|
- Added add/remove syntax for command `pcs stonith update-scsi-devices`
|
||||||
|
- Resolves: rhbz#1992668
|
||||||
|
|
||||||
|
* Fri Aug 27 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.10-2
|
||||||
|
- Fixed create resources with depth operation attribute
|
||||||
|
- Resolves: rhbz#1998454
|
||||||
|
|
||||||
|
* Thu Aug 19 2021 Ondrej Mular <omular@redhat.com> - 0.10.10-1
|
||||||
|
- Rebased to latest upstream sources (see CHANGELOG.md)
|
||||||
|
- Updated pcs-web-ui
|
||||||
|
- Resolves: rhbz#1885293 rhbz#1847102 rhbz#1935594
|
||||||
|
|
||||||
|
* Tue Aug 10 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.9-1
|
||||||
|
- Rebased to latest upstream sources (see CHANGELOG.md)
|
||||||
|
- Resolves: rhbz#1432097 rhbz#1847102 rhbz#1935594 rhbz#1984901
|
||||||
|
|
||||||
|
* Tue Jul 20 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.8-4
|
||||||
|
- Rebased to latest upstream sources (see CHANGELOG.md)
|
||||||
|
- Resolves: rhbz#1759995 rhbz#1872378 rhbz#1935594
|
||||||
|
|
||||||
|
* Thu Jul 08 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.8-3
|
||||||
|
- Rebased to latest upstream sources (see CHANGELOG.md)
|
||||||
|
- Gating changes
|
||||||
|
- Resolves: rhbz#1678273 rhbz#1690419 rhbz#1750240 rhbz#1759995 rhbz#1872378 rhbz#1909901 rhbz#1935594
|
||||||
|
|
||||||
|
* Thu Jun 10 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.8-2
|
||||||
|
- Rebased to latest upstream sources (see CHANGELOG.md)
|
||||||
|
- Updated pcs-web-ui
|
||||||
|
- Resolves: rhbz#1285269 rhbz#1290830 rhbz#1720221 rhbz#1841019 rhbz#1854238 rhbz#1882291 rhbz#1885302 rhbz#1886342 rhbz#1896458 rhbz#1922996 rhbz#1927384 rhbz#1927394 rhbz#1930886 rhbz#1935594
|
||||||
|
|
||||||
* Mon Feb 01 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.8-1
|
* Mon Feb 01 2021 Miroslav Lisik <mlisik@redhat.com> - 0.10.8-1
|
||||||
- Rebased to latest upstream sources (see CHANGELOG.md)
|
- Rebased to latest upstream sources (see CHANGELOG.md)
|
||||||
- Updated pcs-web-ui
|
- Updated pcs-web-ui
|
||||||
|
Loading…
Reference in New Issue
Block a user