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-09-20 13:29:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/crmsh (Old) and /work/SRC/openSUSE:Factory/.crmsh.new.16627 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "crmsh" Wed Sep 20 13:29:56 2023 rev:305 rq:1112416 version:4.5.0+20230920.7a060972 Changes: -------- --- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes 2023-08-09 17:26:09.657719339 +0200 +++ /work/SRC/openSUSE:Factory/.crmsh.new.16627/crmsh.changes 2023-09-20 13:33:09.091161684 +0200 @@ -1,0 +2,36 @@ +Tue Sep 19 23:02:25 UTC 2023 - xli...@suse.com + +- Update to version 4.5.0+20230920.7a060972: + * Dev: workflows: Enable delivery and submit CD stages for branch crmsh-4.6 + +------------------------------------------------------------------- +Mon Aug 21 08:35:13 UTC 2023 - xli...@suse.com + +- Update to version 4.5.0+20230821.76d42b85: + * Dev: codecov: allow minor drop (< 0.1%) in coverage checks + * [crmsh-4.5] Fix: github-actions: add condition to prevent crm-cd.yml running in a forked repo + +------------------------------------------------------------------- +Wed Aug 16 14:26:30 UTC 2023 - xli...@suse.com + +- Update to version 4.5.0+20230816.24bf5f1f: + * Dev: utils: strip new line when get_stdout_or_raise_error returns + +------------------------------------------------------------------- +Thu Aug 10 09:15:15 UTC 2023 - xli...@suse.com + +- Update to version 4.5.0+20230810.74b9b4d5: + * Fix: codecov: delay notifications until all reports are uploaded + * Dev: behave: adjust functional tests for previous changes + * Dev: unittest: adjust unittest for previous changes + * Fix: prun: setsid to prevent ssh from asking a password from terminal + * Fix: upgradeutil: reduce the timeout for getting sequence from remote node (bsc#1213797) + +------------------------------------------------------------------- +Thu Aug 10 02:12:36 UTC 2023 - nicholas.y...@suse.com + +- Update to version 4.5.0+20230810.01db025c: + * Dev: behave: Adjust functional test based on previous change + * Dev: corosync: Enable logging.to_logfile + +------------------------------------------------------------------- Old: ---- crmsh-4.5.0+20230809.ddb17a0b.tar.bz2 New: ---- crmsh-4.5.0+20230920.7a060972.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ crmsh.spec ++++++ --- /var/tmp/diff_new_pack.Xw9McO/_old 2023-09-20 13:33:10.895226315 +0200 +++ /var/tmp/diff_new_pack.Xw9McO/_new 2023-09-20 13:33:10.899226459 +0200 @@ -36,7 +36,7 @@ Summary: High Availability cluster command-line interface License: GPL-2.0-or-later Group: %{pkg_group} -Version: 4.5.0+20230809.ddb17a0b +Version: 4.5.0+20230920.7a060972 Release: 0 URL: http://crmsh.github.io Source0: %{name}-%{version}.tar.bz2 ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.Xw9McO/_old 2023-09-20 13:33:10.931227605 +0200 +++ /var/tmp/diff_new_pack.Xw9McO/_new 2023-09-20 13:33:10.935227749 +0200 @@ -9,7 +9,7 @@ </service> <service name="tar_scm"> <param name="url">https://github.com/ClusterLabs/crmsh.git</param> - <param name="changesrevision">1b6bae9b438c538c644f68386b5a5ebcf92e4b91</param> + <param name="changesrevision">87f2182d748f0dd0d9b5c2e1a0d4c98bd1dfd148</param> </service> </servicedata> (No newline at EOF) ++++++ crmsh-4.5.0+20230809.ddb17a0b.tar.bz2 -> crmsh-4.5.0+20230920.7a060972.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/.github/workflows/crmsh-cd.yml new/crmsh-4.5.0+20230920.7a060972/.github/workflows/crmsh-cd.yml --- old/crmsh-4.5.0+20230809.ddb17a0b/.github/workflows/crmsh-cd.yml 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/.github/workflows/crmsh-cd.yml 2023-09-20 00:36:40.000000000 +0200 @@ -16,16 +16,17 @@ jobs: integration: + if: github.repository == 'ClusterLabs/crmsh' && github.ref_name == 'crmsh-4.6' uses: ./.github/workflows/crmsh-ci.yml delivery: + if: github.repository == 'ClusterLabs/crmsh' && github.ref_name == 'crmsh-4.6' needs: integration runs-on: ubuntu-20.04 timeout-minutes: 10 steps: - uses: actions/checkout@v3 - name: delivery process - if: github.repository == 'ClusterLabs/crmsh' && github.ref_name == 'crmsh-4.5' && github.event_name == 'push' run: | docker pull shap/continuous_deliver:latest docker run -t -v "$(pwd):/package" \ @@ -38,13 +39,13 @@ /bin/bash -c "cd /package;/scripts/upload.sh" submit: + if: github.repository == 'ClusterLabs/crmsh' && github.ref_name == 'crmsh-4.6' needs: delivery runs-on: ubuntu-20.04 timeout-minutes: 10 steps: - uses: actions/checkout@v3 - name: submit process - if: github.repository == 'ClusterLabs/crmsh' && github.ref_name == 'crmsh-4.5' && github.event_name == 'push' run: | docker pull shap/continuous_deliver:latest docker run -t -v "$(pwd):/package" \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/codecov.yml new/crmsh-4.5.0+20230920.7a060972/codecov.yml --- old/crmsh-4.5.0+20230809.ddb17a0b/codecov.yml 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/codecov.yml 2023-09-20 00:36:40.000000000 +0200 @@ -1,4 +1,14 @@ +coverage: + status: + project: + default: + threshold: 0.1% + patch: + default: + threshold: 0.1% codecov: - token: 16b01c29-3b23-4923-b33a-4d26a49d80c4 + token: 16b01c29-3b23-4923-b33a-4d26a49d80c4 + notify: + after_n_builds: 22 comment: after_n_builds: 22 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/corosync.py new/crmsh-4.5.0+20230920.7a060972/crmsh/corosync.py --- old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/corosync.py 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/crmsh/corosync.py 2023-09-20 00:36:40.000000000 +0200 @@ -618,7 +618,7 @@ logging { fileline: off to_stderr: no - to_logfile: no + to_logfile: yes logfile: /var/log/cluster/corosync.log to_syslog: yes debug: off diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/prun/prun.py new/crmsh-4.5.0+20230920.7a060972/crmsh/prun/prun.py --- old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/prun/prun.py 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/crmsh/prun/prun.py 2023-09-20 00:36:40.000000000 +0200 @@ -96,7 +96,7 @@ def _build_run_task(remote: str, cmdline: str) -> Task: - local_sudoer, remote_sudoer = crmsh.utils.user_pair_for_ssh(remote) + local_sudoer, remote_sudoer = crmsh.utils.UserOfHost.instance().user_pair_for_ssh(remote) if _is_local_host(remote): if 0 == os.geteuid(): args = ['/bin/sh'] @@ -147,7 +147,7 @@ else: return {x: None for x in hosts} flags = '-pr' if recursive else '-p' - local_sudoer, _ = crmsh.utils.user_pair_for_ssh(hosts[0]) + local_sudoer, _ = crmsh.utils.UserOfHost.instance().user_pair_for_ssh(hosts[0]) script = "put {} '{}' '{}'\n".format(flags, src, dst) ssh = None try: @@ -171,7 +171,7 @@ def _build_copy_task(ssh: str, script: str, host: str): - _, remote_sudoer = crmsh.utils.user_pair_for_ssh(host) + _, remote_sudoer = crmsh.utils.UserOfHost.instance().user_pair_for_ssh(host) cmd = "sftp {} {} -o BatchMode=yes -s 'sudo PATH=/usr/lib/ssh:/usr/libexec/ssh /bin/sh -c \"exec sftp-server\"' -b - {}@{}".format( ssh, crmsh.constants.SSH_OPTION, @@ -206,7 +206,7 @@ Files are copied to directory <dst>/<host>/ corresponding to each source host.""" flags = '-pR' if recursive else '-p' - local_sudoer, _ = crmsh.utils.user_pair_for_ssh(hosts[0]) + local_sudoer, _ = crmsh.utils.UserOfHost.instance().user_pair_for_ssh(hosts[0]) ssh = None try: ssh = tempfile.NamedTemporaryFile('w', encoding='utf-8', delete=False) @@ -232,7 +232,7 @@ def _build_fetch_task( ssh: str, host: str, src: str, dst: str, flags: str) -> Task: - _, remote_sudoer = crmsh.utils.user_pair_for_ssh(host) + _, remote_sudoer = crmsh.utils.UserOfHost.instance().user_pair_for_ssh(host) cmd = "sftp {} {} -o BatchMode=yes -s 'sudo PATH=/usr/lib/ssh:/usr/libexec/ssh /bin/sh -c \"exec sftp-server\"' -b - {}@{}".format( ssh, crmsh.constants.SSH_OPTION, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/prun/runner.py new/crmsh-4.5.0+20230920.7a060972/crmsh/prun/runner.py --- old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/prun/runner.py 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/crmsh/prun/runner.py 2023-09-20 00:36:40.000000000 +0200 @@ -103,6 +103,7 @@ stdin=asyncio.subprocess.PIPE if task.input else asyncio.subprocess.DEVNULL, stdout=stdout, stderr=stderr, + start_new_session=True, ) finally: # Closing the pipe inlet make the writer thread to exit. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/upgradeutil.py new/crmsh-4.5.0+20230920.7a060972/crmsh/upgradeutil.py --- old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/upgradeutil.py 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/crmsh/upgradeutil.py 2023-09-20 00:36:40.000000000 +0200 @@ -17,6 +17,8 @@ # touch this file to force a upgrade process FORCE_UPGRADE_FILE_PATH = DATA_DIR + '/upgrade_forced' +TIMEOUT_SSH_GET_SEQUENCE = 3 + VERSION_FEATURES = { (1, 0): [crmsh.healthcheck.PasswordlessHaclusterAuthenticationFeature] @@ -92,11 +94,19 @@ def _is_cluster_target_seq_consistent(nodes): cmd = '/usr/bin/env python3 -m crmsh.upgradeutil get-seq' try: - results = list(_parallax_run(nodes, cmd).values()) - except crmsh.parallax.Error as e: + results = prun.prun({node: cmd for node in nodes}, timeout_seconds=TIMEOUT_SSH_GET_SEQUENCE) + for node, result in results.items(): + if isinstance(result, prun.PRunError): + logger.debug("upgradeutil: get-seq failed: %s", result) + raise _SkipUpgrade() from None + except (prun.PRunError, crmsh.utils.UserOfHost.UserNotFoundError) as e: + logger.debug("upgradeutil: get-seq failed: %s", e) raise _SkipUpgrade() from None try: - return all(CURRENT_UPGRADE_SEQ == _parse_upgrade_seq(stdout.strip()) if rc == 0 else False for rc, stdout, stderr in results) + return all( + CURRENT_UPGRADE_SEQ == _parse_upgrade_seq(result.stdout.strip()) if result.returncode == 0 else False + for result in results.values() + ) except ValueError as e: logger.warning("Remote command '%s' returns unexpected output: %s", cmd, results, exc_info=e) return False @@ -137,8 +147,7 @@ return nodes = crmsh.utils.list_cluster_nodes(no_reg=True) if nodes is not None and len(nodes) > 1 \ - and _is_upgrade_needed(nodes) \ - and not crmsh.utils.check_passwordless_between_nodes(nodes): + and _is_upgrade_needed(nodes): logger.debug("upgradeutil: configuration fix needed") try: if not _is_cluster_target_seq_consistent(nodes): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/utils.py new/crmsh-4.5.0+20230920.7a060972/crmsh/utils.py --- old/crmsh-4.5.0+20230809.ddb17a0b/crmsh/utils.py 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/crmsh/utils.py 2023-09-20 00:36:40.000000000 +0200 @@ -2372,39 +2372,6 @@ return rc != 0 -def check_passwordless_between_nodes(node_list, user='root'): - """ - Check passwordless between cluster nodes - Suppose each node has the same user - Return a list of hosts that require passwords between - """ - need_pw_pair_list = [] - me = this_node() - # check local node between remote node - for node in node_list: - if node == me: - continue - if check_ssh_passwd_need(user, user, node): - need_pw_pair_list.append((me, node)) - - if not need_pw_pair_list: - for node in node_list: - for n in node_list: - if node == n or node == me: - continue - if user == 'root': - cmd = f"ssh {node} \"ssh {SSH_OPTION} -T -o Batchmode=yes {user}@{n} true\"" - else: - cmd = f"ssh {node} \"su - {user} -c 'ssh {SSH_OPTION} -T -o Batchmode=yes {user}@{n} true'\"" - rc, _, _ = get_stdout_stderr(cmd) - if rc != 0: - need_pw_pair_list.append((node, n)) - - for m, n in need_pw_pair_list: - logger.debug("There is no passwordless configured from %s to %s under '%s'", m, n, user) - return need_pw_pair_list - - def check_port_open(ip, port): import socket @@ -2950,7 +2917,7 @@ stderr=subprocess.DEVNULL if no_raise else subprocess.PIPE, ) if no_raise or result.returncode in success_val_list: - return result.stdout.decode('utf-8') + return result.stdout.decode('utf-8').strip('\n') else: if remote is None: raise ValueError("Failed to run '{}': {}".format(cmd, result.stderr.decode('utf-8'))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/test/features/bootstrap_bugs.feature new/crmsh-4.5.0+20230920.7a060972/test/features/bootstrap_bugs.feature --- old/crmsh-4.5.0+20230809.ddb17a0b/test/features/bootstrap_bugs.feature 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/test/features/bootstrap_bugs.feature 2023-09-20 00:36:40.000000000 +0200 @@ -186,7 +186,7 @@ @skip_non_root @clean - Scenario: Do upgrade job without root passwordless + Scenario: Skip upgrade when preconditions are not satisfied Given Cluster service is "stopped" on "hanode1" And Cluster service is "stopped" on "hanode2" When Run "crm cluster init -y" on "hanode1" @@ -194,6 +194,9 @@ When Run "crm cluster join -c hanode1 -y" on "hanode2" Then Cluster service is "started" on "hanode2" When Run "rm -f /var/lib/crmsh/upgrade_seq" on "hanode1" - And Run "rm -f /root/.config/crm/crm.conf" on "hanode1" - And Run "rm -rf /root/.ssh" on "hanode1" - And Run "crm status" on "hanode1" + And Run "mv /root/.config/crm/crm.conf{,.bak}" on "hanode1" + Then Run "crm status" OK on "hanode1" + When Run "rm -f /var/lib/crmsh/upgrade_seq" on "hanode1" + And Run "mv /root/.config/crm/crm.conf{.bak,}" on "hanode1" + And Run "mv /root/.ssh{,.bak}" on "hanode1" + Then Run "crm status" OK on "hanode1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/test/features/crm_report_bugs.feature new/crmsh-4.5.0+20230920.7a060972/test/features/crm_report_bugs.feature --- old/crmsh-4.5.0+20230809.ddb17a0b/test/features/crm_report_bugs.feature 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/test/features/crm_report_bugs.feature 2023-09-20 00:36:40.000000000 +0200 @@ -45,15 +45,26 @@ @clean Scenario: Collect corosync.log(bsc#1148874) - When Run "sed -i 's/\(\s+logfile:\s+\).*/\1\/var\/log\/cluster\/corosync.log/' /etc/corosync/corosync.conf" on "hanode1" + When Run "sed -i 's/\(\s*to_logfile:\s*\).*/\1no/' /etc/corosync/corosync.conf" on "hanode1" + When Run "sed -i 's/\(\s*to_logfile:\s*\).*/\1no/' /etc/corosync/corosync.conf" on "hanode2" + And Run "corosync-cfgtool -R" on "hanode1" + And Run "rm -f /var/log/cluster/corosync.log" on "hanode1" + And Run "rm -f /var/log/cluster/corosync.log" on "hanode2" + And Run "crm cluster stop --all" on "hanode1" + And Run "crm cluster start --all" on "hanode1" + And Run "sleep 15" on "hanode1" + And Run "crm report report" on "hanode1" And Run "tar jxf report.tar.bz2" on "hanode1" Then File "corosync.log" not in "report.tar.bz2" When Run "rm -rf report.tar.gz report" on "hanode1" When Run "sed -i 's/\(\s*to_logfile:\s*\).*/\1yes/' /etc/corosync/corosync.conf" on "hanode1" - And Run "crm cluster stop" on "hanode1" - And Run "crm cluster start" on "hanode1" + When Run "sed -i 's/\(\s*to_logfile:\s*\).*/\1yes/' /etc/corosync/corosync.conf" on "hanode2" + And Run "crm cluster stop --all" on "hanode1" + And Run "crm cluster start --all" on "hanode1" + And Run "sleep 15" on "hanode1" + And Run "crm report report" on "hanode1" And Run "tar jxf report.tar.bz2" on "hanode1" Then File "corosync.log" in "report.tar.bz2" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/test/features/steps/step_implementation.py new/crmsh-4.5.0+20230920.7a060972/test/features/steps/step_implementation.py --- old/crmsh-4.5.0+20230809.ddb17a0b/test/features/steps/step_implementation.py 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/test/features/steps/step_implementation.py 2023-09-20 00:36:40.000000000 +0200 @@ -102,6 +102,11 @@ _, out, _ = run_command_local_or_remote(context, cmd, addr) +@then('Run "{cmd}" OK on "{addr}"') +def step_impl(context, cmd, addr): + _, out, _ = run_command_local_or_remote(context, cmd, addr) + + @then('Print stdout') def step_impl(context): context.logger.info("\n{}".format(context.stdout)) @@ -493,10 +498,19 @@ def step_impl(context, nodelist): if userdir.getuser() != 'root' or userdir.get_sudoer(): return True - need_pw_list = crmutils.check_passwordless_between_nodes(nodelist.split(), 'hacluster') - for m, n in need_pw_list: - context.logger.error(f"There is no passwordless configured from {m} to {n} under 'hacluster'") - assert need_pw_list == [] + failed = False + nodes = nodelist.split() + for i in range(0, len(nodes)): + for j in range(i + 1, len(nodes)): + rc, _, _ = behave_agent.call( + nodes[i], 1122, + f'ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 {nodes[j]} true', + user='hacluster', + ) + if rc != 0: + failed = True + context.logger.error(f"There is no passwordless configured from {nodes[i]} to {nodes[j]} under 'hacluster'") + assert not failed @then('Check user shell for hacluster between "{nodelist}"') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/test/unittests/test_prun.py new/crmsh-4.5.0+20230920.7a060972/test/unittests/test_prun.py --- old/crmsh-4.5.0+20230809.ddb17a0b/test/unittests/test_prun.py 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/test/unittests/test_prun.py 2023-09-20 00:36:40.000000000 +0200 @@ -12,7 +12,7 @@ @mock.patch("os.geteuid") @mock.patch("crmsh.userdir.getuser") @mock.patch("crmsh.prun.prun._is_local_host") - @mock.patch("crmsh.utils.user_pair_for_ssh") + @mock.patch("crmsh.utils.UserOfHost.user_pair_for_ssh") @mock.patch("crmsh.prun.runner.Runner.run") @mock.patch("crmsh.prun.runner.Runner.add_task") def test_prun( @@ -61,7 +61,7 @@ @mock.patch("os.geteuid") @mock.patch("crmsh.userdir.getuser") @mock.patch("crmsh.prun.prun._is_local_host") - @mock.patch("crmsh.utils.user_pair_for_ssh") + @mock.patch("crmsh.utils.UserOfHost.user_pair_for_ssh") @mock.patch("crmsh.prun.runner.Runner.run") @mock.patch("crmsh.prun.runner.Runner.add_task") def test_prun_root( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.5.0+20230809.ddb17a0b/test/unittests/test_utils.py new/crmsh-4.5.0+20230920.7a060972/test/unittests/test_utils.py --- old/crmsh-4.5.0+20230809.ddb17a0b/test/unittests/test_utils.py 2023-08-08 23:52:16.000000000 +0200 +++ new/crmsh-4.5.0+20230920.7a060972/test/unittests/test_utils.py 2023-09-20 00:36:40.000000000 +0200 @@ -1899,20 +1899,3 @@ with pytest.raises(utils.TerminateSubCommand) as err: utils.check_user_access('cluster') mock_error.assert_called_once_with('Please run this command starting with "sudo".\nCurrently, this command needs to use sudo to escalate itself as root.\nPlease consider to add "user" as sudoer. For example:\n sudo bash -c \'echo "user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/user\'') - - -@mock.patch('logging.Logger.debug') -@mock.patch('crmsh.utils.get_stdout_stderr') -@mock.patch('crmsh.utils.check_ssh_passwd_need') -@mock.patch('crmsh.utils.this_node') -def test_check_passwordless_between_nodes(mock_this_node, mock_check_ssh, mock_run, mock_debug): - mock_this_node.return_value = "node1" - mock_check_ssh.return_value = False - mock_run.return_value = (1, None, None) - - res_list = utils.check_passwordless_between_nodes(["node1", "node2"]) - assert res_list == [("node2", "node1")] - - mock_run.assert_called_once_with('ssh node2 "ssh -o StrictHostKeyChecking=no -T -o Batchmode=yes root@node1 true"') - mock_debug.assert_called_once_with("There is no passwordless configured from %s to %s under '%s'", 'node2', 'node1', 'root') -