Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package crmsh for openSUSE:Factory checked 
in at 2023-06-16 16:55:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/crmsh (Old)
 and      /work/SRC/openSUSE:Factory/.crmsh.new.15902 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "crmsh"

Fri Jun 16 16:55:45 2023 rev:298 rq:1093455 version:4.5.0+20230616.cf763cd1

Changes:
--------
--- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes      2023-05-25 
23:52:37.847644121 +0200
+++ /work/SRC/openSUSE:Factory/.crmsh.new.15902/crmsh.changes   2023-06-16 
16:56:52.598426841 +0200
@@ -1,0 +2,17 @@
+Fri Jun 16 08:49:12 UTC 2023 - xli...@suse.com
+
+- Update to version 4.5.0+20230616.cf763cd1:
+  * Dev: unittest: Adjust unit test for previous changes
+  * Dev: behave: Add functional test for previous change
+  * Dev: remove unused codes
+  * Dev: ui_cluster: Use 'CustomAppendAction' instead of 'append' argparse 
action
+
+-------------------------------------------------------------------
+Thu Jun 01 02:12:23 UTC 2023 - xli...@suse.com
+
+- Update to version 4.5.0+20230531.b167a2d7:
+  * Dev: bootstrap: Configure ssh key when fetch geo config
+  * Dev: cmd_status: Use --output-as option instead of deprecated --as-html 
and --as-xml options
+  * Dev: cmd_status: Append 'with quorum' and 'WITHOUT quorum' to display 
keyword list
+
+-------------------------------------------------------------------

Old:
----
  crmsh-4.5.0+20230517.b2cb988b.tar.bz2

New:
----
  crmsh-4.5.0+20230616.cf763cd1.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ crmsh.spec ++++++
--- /var/tmp/diff_new_pack.unp4gR/_old  2023-06-16 16:56:53.286430899 +0200
+++ /var/tmp/diff_new_pack.unp4gR/_new  2023-06-16 16:56:53.294430947 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package crmsh
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -36,9 +36,9 @@
 Summary:        High Availability cluster command-line interface
 License:        GPL-2.0-or-later
 Group:          %{pkg_group}
-Version:        4.5.0+20230517.b2cb988b
+Version:        4.5.0+20230616.cf763cd1
 Release:        0
-URL:            http://crmsh.github.io
+Url:            http://crmsh.github.io
 Source0:        %{name}-%{version}.tar.bz2
 Source1:        %{name}.tmpfiles.d.conf
 
@@ -54,8 +54,7 @@
 Requires:       python3-lxml
 Requires:       python3-python-dateutil
 BuildRequires:  python3-lxml
-BuildRequires:  python3-pip
-BuildRequires:  python3-wheel
+BuildRequires:  python3-setuptools
 
 %if 0%{?suse_version}
 # only require csync2 on SUSE since bootstrap
@@ -82,14 +81,14 @@
 BuildRequires:  pkgconfig
 BuildRequires:  python3
 
-%if 0%{?suse_version}
+%if 0%{?suse_version} > 1210
 # xsltproc is necessary for manpage generation; this is split out into
 # libxslt-tools as of openSUSE 12.2.  Possibly strictly should be
 # required by asciidoc
 BuildRequires:  libxslt-tools
 %endif
 
-%if 0%{?suse_version} || 0%{?fedora_version} || 0%{?centos_version} || 
0%{?rhel_version} || 0%{?rhel} || 0%{?fedora}
+%if 0%{?suse_version} > 1110 || 0%{?fedora_version} || 0%{?centos_version} || 
0%{?rhel_version} || 0%{?rhel} || 0%{?fedora}
 BuildArch:      noarch
 %endif
 
@@ -109,7 +108,9 @@
 Requires(post): python3-python-dateutil
 Requires(post): python3-tox
 Requires(post): pacemaker
+%if 0%{?suse_version} > 1110
 BuildArch:      noarch
+%endif
 %if 0%{?suse_version}
 Requires(post): libglue-devel
 %else
@@ -143,14 +144,8 @@
 
 # replace the shebang in all the scripts
 # with ${_bindir}/python3
-find . -type f -exec sed -i \
-    -e "s|#!/usr/bin/python3?|#!%{__python3}|" \
-    -e "s|#!/usr/bin/env python3?|#!%{__python3}|" \
-    {} \;
-sed -i -e '1{\@^#!%{_bindir}/python3@d}' crmsh/report/core.py
-
-# this is wrong FIXME
-sed -i -e '/data_files/d' setup.py
+find . -type f -exec perl -pi -e 'BEGIN{undef 
$/};s[^#\!/usr/bin/python[3]?][#\!%{_bindir}/python3]' {} \;
+find . -type f -exec perl -pi -e 'BEGIN{undef $/};s[^#\!/usr/bin/env 
python[3]?][#\!%{_bindir}/python3]' {} \;
 
 %build
 ./autogen.sh
@@ -161,16 +156,7 @@
     --with-version=%{version}    \
     --docdir=%{crmsh_docdir}
 
-%python3_pyproject_wheel
-
-# Generate manpages
-for manpg in doc/crm{,sh_crm_report}.8.adoc ; do
-    a2x -f manpage $manpg
-done
-
-for docad in doc/crm{,sh_crm_report}.8.adoc ; do
-    asciidoc --unsafe --backend=xhtml11 $docad
-done
+make %{_smp_mflags} VERSION="%{version}" sysconfdir=%{_sysconfdir} 
localstatedir=%{_var}
 
 %if %{with regression_tests}
 tox
@@ -181,39 +167,14 @@
 %endif
 
 %install
-# make DESTDIR=%%{buildroot} docdir=%%{crmsh_docdir} install
-%python3_pyproject_install
-
-# additional directories
-install -d -m0770 %{buildroot}%{_localstatedir}/cache/crm
-install -d -m0770 %{buildroot}%{_localstatedir}/log/crmsh
-install -d -m0755 %{buildroot}%{_tmpfilesdir}
-
-# install configuration
-install -Dm0644 -t %{buildroot}%{_sysconfdir}/crm etc/{crm.conf,profiles.yml}
-install -m0644 %{SOURCE1} %{buildroot}%{_tmpfilesdir}/%{name}.conf
-
-# install manpages
-install -Dpm0644 -t %{buildroot}%{_mandir}/man8 doc/*.8
-install -Dpm0644 -t %{buildroot}%{_datadir}/crmsh/ doc/crm.8.adoc
-
-# install data
-for d in $(cat data-manifest); do
-       if [ -x $d ] ; then mode="0755" ; else mode="0644" ; fi
-       install -D -m $mode $d %{buildroot}%{_datadir}/crmsh/$d
-done
-mv %{buildroot}%{_datadir}/crmsh/test{,s}
-install -p test/testcases/xmlonly.sh \
-       %{buildroot}%{_datadir}/crmsh/tests/testcases/configbasic-xml.filter
-
-install -Dm0644 contrib/bash_completion.sh \
-       %{buildroot}%{_datadir}/bash-completion/completions/crm
-
+make DESTDIR=%{buildroot} docdir=%{crmsh_docdir} install
+install -Dm0644 contrib/bash_completion.sh 
%{buildroot}%{_datadir}/bash-completion/completions/crm
 if [ -f %{buildroot}%{_bindir}/crm ]; then
        install -Dm0755 %{buildroot}%{_bindir}/crm %{buildroot}%{_sbindir}/crm
        rm %{buildroot}%{_bindir}/crm
 fi
-
+install -d -m 0755 %{buildroot}%{_tmpfilesdir}
+install -m 0644 %{SOURCE1} %{buildroot}%{_tmpfilesdir}/%{name}.conf
 %if 0%{?suse_version}
 %fdupes %{buildroot}
 %endif
@@ -257,13 +218,20 @@
 
 %{_tmpfilesdir}/%{name}.conf
 
-%doc doc/*.html
-%doc COPYING AUTHORS ChangeLog README.md
-%doc contrib/*
-%{_mandir}/man8/*
+%doc %{_mandir}/man8/*
+%{crmsh_docdir}/COPYING
+%{crmsh_docdir}/AUTHORS
+%{crmsh_docdir}/crm.8.html
+%{crmsh_docdir}/crmsh_crm_report.8.html
+%{crmsh_docdir}/profiles.html
+%{crmsh_docdir}/ChangeLog
+%{crmsh_docdir}/README.md
+%{crmsh_docdir}/contrib/*
 
 %config %{_sysconfdir}/crm
 
+%dir %{crmsh_docdir}
+%dir %{crmsh_docdir}/contrib
 %dir %attr (770, %{uname}, %{gname}) %{_var}/cache/crm
 %dir %attr (770, %{uname}, %{gname}) %{_var}/log/crmsh
 %{_datadir}/bash-completion/completions/crm

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.unp4gR/_old  2023-06-16 16:56:53.338431206 +0200
+++ /var/tmp/diff_new_pack.unp4gR/_new  2023-06-16 16:56:53.338431206 +0200
@@ -9,7 +9,7 @@
 </service>
 <service name="tar_scm">
   <param name="url">https://github.com/ClusterLabs/crmsh.git</param>
-  <param 
name="changesrevision">03c1da25a4e2c9a80032e824dad72a2ffbad614a</param>
+  <param 
name="changesrevision">e69c76eeac27ae8ba34a75e2baed215e26ceb224</param>
 </service>
 </servicedata>
 (No newline at EOF)

++++++ crmsh-4.5.0+20230517.b2cb988b.tar.bz2 -> 
crmsh-4.5.0+20230616.cf763cd1.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.5.0+20230517.b2cb988b/crmsh/bootstrap.py 
new/crmsh-4.5.0+20230616.cf763cd1/crmsh/bootstrap.py
--- old/crmsh-4.5.0+20230517.b2cb988b/crmsh/bootstrap.py        2023-05-17 
08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/crmsh/bootstrap.py        2023-06-16 
10:11:36.000000000 +0200
@@ -226,7 +226,6 @@
             self.node_list = [self.cluster_node]
             return
 
-        self.node_list = utils.parse_append_action_argument(self.node_list)
         if any('@' in user_node for user_node in self.node_list):
             self.initialize_user(users_of_specified_hosts='specified')
         elif len(self.node_list) == 0:
@@ -256,8 +255,6 @@
 
         if self.node_list and self.stage:
             utils.fatal("Can't use -N/--nodes option and stage({}) 
together".format(self.stage))
-        if utils.has_dup_value(self.node_list):
-            utils.fatal("Duplicated input for -N/--nodes option")
         for node in self.node_list:
             utils.ping_node(node)
 
@@ -285,8 +282,6 @@
         if self.nic_list:
             if len(self.nic_list) > 2:
                 utils.fatal("Maximum number of interface is 2")
-            if utils.has_dup_value(self.nic_list):
-                utils.fatal("Duplicated input for -i/--interface option")
         if self.no_overwrite_sshkey:
             logger.warning("--no-overwrite-sshkey option is deprecated since 
crmsh does not overwrite ssh keys by default anymore and will be removed in 
future versions")
         if self.type == "join" and self.watchdog:
@@ -2747,6 +2742,7 @@
             except utils.UserOfHost.UserNotFoundError:
                 local_user = userdir.getuser()
             remote_user = local_user
+    configure_ssh_key(local_user)
     logger.info("Retrieving configuration - This may prompt for %s@%s:", 
remote_user, node)
     utils.ssh_copy_id(local_user, remote_user, node)
     cmd = "tar -c -C '{}' .".format(BOOTH_DIR)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.5.0+20230517.b2cb988b/crmsh/cmd_status.py 
new/crmsh-4.5.0+20230616.cf763cd1/crmsh/cmd_status.py
--- old/crmsh-4.5.0+20230517.b2cb988b/crmsh/cmd_status.py       2023-05-17 
08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/crmsh/cmd_status.py       2023-06-16 
10:11:36.000000000 +0200
@@ -16,8 +16,10 @@
           'Not installed',
           r'UNKNOWN\!',
           'Stopped',
-          'standby']
-_OKS = ['Masters', 'Slaves', 'Started', 'Master', 'Slave', 'Online', 'online', 
'ok', 'master']
+          'standby',
+          'WITHOUT quorum']
+_OKS = ['Masters', 'Slaves', 'Started', 'Master', 'Slave', 'Online', 'online', 
'ok', 'master',
+        'with quorum']
 _ERRORS = ['not running',
            'unknown error',
            'invalid parameter',
@@ -101,8 +103,8 @@
         "failcounts": "-f",
         "verbose": "-V",
         "quiet": "-Q",
-        "html": "--as-html",
-        "xml": "--as-xml",
+        "html": "--output-as html",
+        "xml": "--output-as xml",
         "simple": "-s",
         "tickets": "-c",
         "noheaders": "-D",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.5.0+20230517.b2cb988b/crmsh/ocfs2.py 
new/crmsh-4.5.0+20230616.cf763cd1/crmsh/ocfs2.py
--- old/crmsh-4.5.0+20230517.b2cb988b/crmsh/ocfs2.py    2023-05-17 
08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/crmsh/ocfs2.py    2023-06-16 
10:11:36.000000000 +0200
@@ -40,7 +40,7 @@
         """
         Init function
         """
-        self.ocfs2_devices = 
utils.parse_append_action_argument(context.ocfs2_devices)
+        self.ocfs2_devices = context.ocfs2_devices
         self.use_cluster_lvm2 = context.use_cluster_lvm2
         self.mount_point = context.mount_point
         self.use_stage = context.stage == "ocfs2"
@@ -72,8 +72,6 @@
             raise ValueError("Without Cluster LVM2 (-C option), -o option only 
support one device")
         if self.use_cluster_lvm2 and not self.ocfs2_devices:
             raise ValueError("-C option only valid together with -o option")
-        if len(self.ocfs2_devices) != len(set(self.ocfs2_devices)):
-            raise ValueError("Duplicated inputs for -o option")
         if self.mount_point and utils.has_mount_point_used(self.mount_point):
             raise ValueError("Mount point {} already 
mounted".format(self.mount_point))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.5.0+20230517.b2cb988b/crmsh/sbd.py 
new/crmsh-4.5.0+20230616.cf763cd1/crmsh/sbd.py
--- old/crmsh-4.5.0+20230517.b2cb988b/crmsh/sbd.py      2023-05-17 
08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/crmsh/sbd.py      2023-06-16 
10:11:36.000000000 +0200
@@ -385,7 +385,7 @@
         """
         dev_list = []
         if self.sbd_devices_input:
-            dev_list = 
utils.parse_append_action_argument(self.sbd_devices_input)
+            dev_list = self.sbd_devices_input
             self._verify_sbd_device(dev_list)
             for dev in dev_list:
                 self.no_overwrite_map[dev] = self._no_overwrite_check(dev)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.5.0+20230517.b2cb988b/crmsh/ui_cluster.py 
new/crmsh-4.5.0+20230616.cf763cd1/crmsh/ui_cluster.py
--- old/crmsh-4.5.0+20230517.b2cb988b/crmsh/ui_cluster.py       2023-05-17 
08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/crmsh/ui_cluster.py       2023-06-16 
10:11:36.000000000 +0200
@@ -4,7 +4,7 @@
 
 import sys
 import re
-from argparse import ArgumentParser, RawDescriptionHelpFormatter
+from argparse import ArgumentParser, RawDescriptionHelpFormatter, Action
 
 import crmsh.parallax
 from . import command
@@ -68,6 +68,20 @@
     return cluster_name
 
 
+class CustomAppendAction(Action):
+    """
+    Custom class for argparse append action:
+    - Flatten the value like '-s "/dev/sda1;/dev/sda2"'
+    - Detect duplicated input
+    """
+    def __call__(self, parser, namespace, value, option_string=None):
+        items = getattr(namespace, self.dest, [])
+        items.extend([x for x in re.split("[; ]", value) if x])
+        if utils.has_dup_value(items):
+            parser.error(f"Duplicated input for 
'{'/'.join(self.option_strings)}' option")
+        setattr(namespace, self.dest, items)
+
+
 class Cluster(command.UI):
     '''
     Whole cluster management.
@@ -292,7 +306,7 @@
                             help='Answer "yes" to all prompts (use with 
caution, this is destructive, especially those storage related configurations 
and stages.)')
         parser.add_argument("-n", "--name", metavar="NAME", 
dest="cluster_name", default="hacluster",
                             help='Set the name of the configured cluster.')
-        parser.add_argument("-N", "--node", metavar="NODENAME", 
dest="node_list", action="append", default=[],
+        parser.add_argument("-N", "--node", metavar="NODENAME", 
dest="node_list", action=CustomAppendAction, default=[],
                             help='The member node of the cluster. Note: the 
current node is always get initialized during bootstrap in the beginning.')
         parser.add_argument("-S", "--enable-sbd", dest="diskless_sbd", 
action="store_true",
                             help="Enable SBD even if no SBD device is 
configured (diskless mode)")
@@ -304,7 +318,7 @@
                             help='Avoid "/root/.ssh/id_rsa" overwrite if "-y" 
option is used (False by default; Deprecated)')
 
         network_group = parser.add_argument_group("Network configuration", 
"Options for configuring the network and messaging layer.")
-        network_group.add_argument("-i", "--interface", dest="nic_list", 
metavar="IF", action="append", choices=utils.interface_choice(), default=[],
+        network_group.add_argument("-i", "--interface", dest="nic_list", 
metavar="IF", action=CustomAppendAction, choices=utils.interface_choice(), 
default=[],
                                    help="Bind to IP address on interface IF. 
Use -i second time for second interface")
         network_group.add_argument("-u", "--unicast", action="store_true", 
dest="unicast",
                                    help="Configure corosync to communicate 
over unicast(udpu). This is the default transport type")
@@ -334,9 +348,9 @@
                                    help="MODE of operation of heuristics 
(on/sync/off, default:sync)")
 
         storage_group = parser.add_argument_group("Storage configuration", 
"Options for configuring shared storage.")
-        storage_group.add_argument("-s", "--sbd-device", dest="sbd_devices", 
metavar="DEVICE", action="append", default=[],
+        storage_group.add_argument("-s", "--sbd-device", dest="sbd_devices", 
metavar="DEVICE", action=CustomAppendAction, default=[],
                                    help="Block device to use for SBD fencing, 
use \";\" as separator or -s multiple times for multi path (up to 3 devices)")
-        storage_group.add_argument("-o", "--ocfs2-device", 
dest="ocfs2_devices", metavar="DEVICE", action="append", default=[],
+        storage_group.add_argument("-o", "--ocfs2-device", 
dest="ocfs2_devices", metavar="DEVICE", action=CustomAppendAction, default=[],
                 help="Block device to use for OCFS2; When using Cluster LVM2 
to manage the shared storage, user can specify one or multiple raw disks, use 
\";\" as separator or -o multiple times for multi path (must specify -C option) 
NOTE: this is a Technical Preview")
         storage_group.add_argument("-C", "--cluster-lvm2", 
action="store_true", dest="use_cluster_lvm2",
                 help="Use Cluster LVM2 (only valid together with -o option) 
NOTE: this is a Technical Preview")
@@ -418,7 +432,7 @@
             "-c", "--cluster-node", dest="cluster_node", metavar="[USER@]HOST",
             help="User and host to login to an existing cluster node. The host 
can be specified with either a hostname or an IP.",
         )
-        network_group.add_argument("-i", "--interface", dest="nic_list", 
metavar="IF", action="append", choices=utils.interface_choice(), default=[],
+        network_group.add_argument("-i", "--interface", dest="nic_list", 
metavar="IF", action=CustomAppendAction, choices=utils.interface_choice(), 
default=[],
                 help="Bind to IP address on interface IF. Use -i second time 
for second interface")
         options, args = parse_options(parser, args)
         if options is None or args is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.5.0+20230517.b2cb988b/crmsh/utils.py 
new/crmsh-4.5.0+20230616.cf763cd1/crmsh/utils.py
--- old/crmsh-4.5.0+20230517.b2cb988b/crmsh/utils.py    2023-05-17 
08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/crmsh/utils.py    2023-06-16 
10:11:36.000000000 +0200
@@ -3071,20 +3071,6 @@
     return has_stonith_device or using_diskless_sbd
 
 
-def parse_append_action_argument(input_list, parse_re="[; ]"):
-    """
-    Parse append action argument into a list, like:
-      -s "/dev/sdb1;/dev/sdb2"
-      -s /dev/sdb1 -s /dev/sbd2
-
-      Both return ["/dev/sdb1", "/dev/sdb2"]
-    """
-    result_list = []
-    for item in input_list:
-        result_list += re_split_string(parse_re, item)
-    return result_list
-
-
 def has_disk_mounted(dev):
     """
     Check if device already mounted
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crmsh-4.5.0+20230517.b2cb988b/test/features/bootstrap_options.feature 
new/crmsh-4.5.0+20230616.cf763cd1/test/features/bootstrap_options.feature
--- old/crmsh-4.5.0+20230517.b2cb988b/test/features/bootstrap_options.feature   
2023-05-17 08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/test/features/bootstrap_options.feature   
2023-06-16 10:11:36.000000000 +0200
@@ -28,6 +28,12 @@
     Then    Output is the same with expected "crm cluster geo-join" help output
     When    Run "crm cluster geo_init_arbitrator -h" on "hanode1"
     Then    Output is the same with expected "crm cluster geo-init-arbitrator" 
help output
+    When    Try "crm cluster init -i eth1 -i eth1 -y"
+    Then    Except multiple lines
+      """
+      usage: init [options] [STAGE]
+      crm: error: Duplicated input for '-i/--interface' option
+      """
 
   @clean
   Scenario: Init whole cluster service on node "hanode1" using "--node" option
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crmsh-4.5.0+20230517.b2cb988b/test/features/bootstrap_sbd_normal.feature 
new/crmsh-4.5.0+20230616.cf763cd1/test/features/bootstrap_sbd_normal.feature
--- 
old/crmsh-4.5.0+20230517.b2cb988b/test/features/bootstrap_sbd_normal.feature    
    2023-05-17 08:24:19.000000000 +0200
+++ 
new/crmsh-4.5.0+20230616.cf763cd1/test/features/bootstrap_sbd_normal.feature    
    2023-06-16 10:11:36.000000000 +0200
@@ -9,6 +9,12 @@
     Then    Except "ERROR: cluster.init: Maximum number of SBD device is 3"
     When    Try "crm cluster init -s "/dev/sda1;/dev/sdaxxxx" -y"
     Then    Except "ERROR: cluster.init: /dev/sdaxxxx doesn't look like a 
block device"
+    When    Try "crm cluster init -s "/dev/sda1;/dev/sda1" -y"
+    Then    Except multiple lines
+      """
+      usage: init [options] [STAGE]
+      crm: error: Duplicated input for '-s/--sbd-device' option
+      """
 
   @clean
   Scenario: Setup sbd with init and join process(bsc#1170999)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crmsh-4.5.0+20230517.b2cb988b/test/unittests/test_bootstrap.py 
new/crmsh-4.5.0+20230616.cf763cd1/test/unittests/test_bootstrap.py
--- old/crmsh-4.5.0+20230517.b2cb988b/test/unittests/test_bootstrap.py  
2023-05-17 08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/test/unittests/test_bootstrap.py  
2023-06-16 10:11:36.000000000 +0200
@@ -132,17 +132,6 @@
             ctx.validate_option()
         mock_error.assert_called_once_with("Maximum number of interface is 2")
 
-    @mock.patch('crmsh.utils.has_dup_value')
-    @mock.patch('crmsh.utils.fatal')
-    def test_validate_option_error_nic_dup(self, mock_error, mock_dup):
-        mock_dup.return_value = True
-        mock_error.side_effect = SystemExit
-        options = mock.Mock(nic_list=["eth2", "eth2"])
-        ctx = self.ctx_inst.set_context(options)
-        with self.assertRaises(SystemExit):
-            ctx.validate_option()
-        mock_error.assert_called_once_with("Duplicated input for 
-i/--interface option")
-
     @mock.patch('crmsh.utils.fatal')
     @mock.patch('socket.gethostbyname')
     @mock.patch('crmsh.utils.InterfacesInfo.ip_in_local')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crmsh-4.5.0+20230517.b2cb988b/test/unittests/test_ocfs2.py 
new/crmsh-4.5.0+20230616.cf763cd1/test/unittests/test_ocfs2.py
--- old/crmsh-4.5.0+20230517.b2cb988b/test/unittests/test_ocfs2.py      
2023-05-17 08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/test/unittests/test_ocfs2.py      
2023-06-16 10:11:36.000000000 +0200
@@ -87,11 +87,6 @@
             self.ocfs2_inst4._verify_options()
         self.assertEqual("-C option only valid together with -o option", 
str(err.exception))
 
-    def test_verify_options_dup(self):
-        with self.assertRaises(ValueError) as err:
-            self.ocfs2_inst5._verify_options()
-        self.assertEqual("Duplicated inputs for -o option", str(err.exception))
-
     @mock.patch('crmsh.utils.has_mount_point_used')
     def test_verify_options_mount(self, mock_mount):
         mock_mount.return_value = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crmsh-4.5.0+20230517.b2cb988b/test/unittests/test_sbd.py 
new/crmsh-4.5.0+20230616.cf763cd1/test/unittests/test_sbd.py
--- old/crmsh-4.5.0+20230517.b2cb988b/test/unittests/test_sbd.py        
2023-05-17 08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/test/unittests/test_sbd.py        
2023-06-16 10:11:36.000000000 +0200
@@ -457,12 +457,9 @@
         mock_compare.assert_called_once_with("/dev/sdb1", [])
 
     @mock.patch('crmsh.sbd.SBDManager._verify_sbd_device')
-    @mock.patch('crmsh.utils.parse_append_action_argument')
-    def test_get_sbd_device_from_option(self, mock_parse, mock_verify):
-        mock_parse.return_value = ["/dev/sdb1", "/dev/sdc1"]
+    def test_get_sbd_device_from_option(self, mock_verify):
         self.sbd_inst._get_sbd_device()
-        mock_parse.assert_called_once_with(mock_parse.return_value)
-        mock_verify.assert_called_once_with(mock_parse.return_value)
+        mock_verify.assert_called_once_with(['/dev/sdb1', '/dev/sdc1'])
 
     @mock.patch('crmsh.sbd.SBDManager._get_sbd_device_interactive')
     def test_get_sbd_device_from_interactive(self, mock_interactive):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crmsh-4.5.0+20230517.b2cb988b/test/unittests/test_utils.py 
new/crmsh-4.5.0+20230616.cf763cd1/test/unittests/test_utils.py
--- old/crmsh-4.5.0+20230517.b2cb988b/test/unittests/test_utils.py      
2023-05-17 08:24:19.000000000 +0200
+++ new/crmsh-4.5.0+20230616.cf763cd1/test/unittests/test_utils.py      
2023-06-16 10:11:36.000000000 +0200
@@ -1495,13 +1495,6 @@
     mock_run.assert_called_once_with("mount")
 
 
-def test_parse_append_action_argument():
-    res = utils.parse_append_action_argument(["/dev/sda1", "/dev/sda2 "])
-    assert res == ["/dev/sda1", "/dev/sda2"]
-    res = utils.parse_append_action_argument(["/dev/sda1 ; /dev/sda2"])
-    assert res == ["/dev/sda1", "/dev/sda2"]
-
-
 @mock.patch('crmsh.sbd.SBDManager.is_using_diskless_sbd')
 @mock.patch('crmsh.utils.get_stdout_or_raise_error')
 def test_has_stonith_running(mock_run, mock_diskless):

Reply via email to