cephadm: moved check-online,sysctl-dir subcommands under _orch

Moved above mentioned commands under the existing cephadm _orch namespace

Fixes: https://tracker.ceph.com/issues/74045
Signed-off-by: Shweta Bhosale <Shweta.Bhosale1@ibm.com>
This commit is contained in:
Shweta Bhosale 2026-05-18 16:17:47 +05:30
parent 4d35c61283
commit e05ba723be
8 changed files with 62 additions and 73 deletions

View File

@ -552,8 +552,7 @@ cephadm operations. Run a command of the following form:
ceph cephadm set-user <user>
The ``set-user`` command automatically configures the specified user on all cluster
hosts by calling ``cephadm setup-ssh-user`` on each host. This command is available starting
with the Umbrella release and includes the following:
hosts by calling ``cephadm setup-ssh-user`` on each host. This command includes the following:
- Setting up passwordless sudo access for non-root users
- Authorizing the cluster's SSH public key for the user

View File

@ -13,7 +13,7 @@ Synopsis
| [--log-dir LOG_DIR] [--logrotate-dir LOGROTATE_DIR]
| [--unit-dir UNIT_DIR] [--verbose] [--timeout TIMEOUT]
| [--retry RETRY] [--no-container-init]
| {version,pull,inspect-image,ls,list-networks,list-rdma,adopt,rm-daemon,rm-cluster,remove-file,deploy-file,sysctl-dir,run,shell,enter,ceph-volume,unit,logs,bootstrap,deploy,check-host,check-online,prepare-host,prepare-host-sudo-hardening,setup-ssh-user,add-repo,rm-repo,install,list-images,update-osd-service}
| {version,pull,inspect-image,ls,list-networks,list-rdma,adopt,rm-daemon,rm-cluster,remove-file,deploy-file,run,shell,enter,ceph-volume,unit,logs,bootstrap,deploy,check-host,prepare-host,prepare-host-sudo-hardening,setup-ssh-user,add-repo,rm-repo,install,list-images,update-osd-service}
| ...
@ -90,17 +90,19 @@ Synopsis
| **cephadm** **check-host** [-h] [--expect-hostname EXPECT_HOSTNAME]
| **cephadm** **check-online**
| **cephadm** **remove-file** [-h] [--fsid FSID] --path PATH
| **cephadm** **deploy-file** [-h] [--fsid FSID] --path PATH [--mode MODE]
| [--uid UID] [--gid GID]
| **cephadm** **sysctl-dir** [-h] [--fsid FSID] (--list | --apply-system)
| **cephadm** **prepare-host**
| **cephadm** **prepare-host-sudo-hardening** [-h] [--ssh-user SSH_USER]
| [--ssh-pub-key SSH_PUB_KEY]
| [--cephadm-version VERSION]
| **cephadm** **setup-ssh-user** [-h] --ssh-user SSH_USER --ssh-pub-key SSH_PUB_KEY
| **cephadm** **add-repo** [-h] [--release RELEASE] [--version VERSION]
| [--dev DEV] [--dev-commit DEV_COMMIT]
| [--gpg-url GPG_URL] [--repo-url REPO_URL]
@ -298,25 +300,14 @@ Arguments:
* [--expect-hostname EXPECT_HOSTNAME] Check that hostname matches an expected value
check-online
------------
check that the host is online by running ``true`` locally.
This command is primarily intended for cephadm internals (for example, the
offline host watcher), rather than direct operator workflows.
remove-file
-----------
Remove a regular file on the local host. Missing paths are ignored.
Refuses directories and symbolic links, only plain files are
removed.
Arguments:
* [--fsid FSID] cluster FSID (passed automatically when invoked by the orchestrator)
* [--fsid FSID] cluster FSID
* --path PATH absolute path of the file to remove (required)
@ -328,25 +319,13 @@ Write or replace a file on the local host. The **entire file body** is read from
Arguments:
* [--fsid FSID] cluster FSID (passed automatically when invoked by the orchestrator)
* [--fsid FSID] cluster FSID
* --path PATH absolute destination path for the file (required)
* [--mode MODE] octal file mode (for example ``644`` or ``0644``)
* [--uid UID] numeric owner user id (**must** be given together with ``--gid``)
* [--gid GID] numeric owner group id (**must** be given together with ``--uid``)
sysctl-dir
----------
List basenames under ``/etc/sysctl.d`` or run ``sysctl --system`` on the local host.
Arguments:
* [--fsid FSID] cluster FSID (passed automatically when invoked by the orchestrator)
* --list print one directory entry per line (sorted)
* --apply-system reload sysctl settings from all configuration paths
deploy
------

View File

@ -5663,6 +5663,32 @@ def _get_parser():
help='Configuration input source file',
)
parser_check_online = subparsers_orch.add_parser(
'check-online', help='return true to indicate host is running')
parser_check_online.set_defaults(func=command_check_online)
parser_sysctl_dir = subparsers_orch.add_parser(
'sysctl-dir',
help='list entries in sysctl.d or run sysctl --system')
parser_sysctl_dir.set_defaults(func=command_sysctl_dir)
parser_sysctl_dir.add_argument(
'--fsid',
help='cluster FSID')
_sysctl_dir_action = parser_sysctl_dir.add_mutually_exclusive_group(
required=True)
_sysctl_dir_action.add_argument(
'--list',
dest='sysctl_dir_action',
action='store_const',
const='list',
help=f'print one basename per line from {SYSCTL_DIR}')
_sysctl_dir_action.add_argument(
'--apply-system',
dest='sysctl_dir_action',
action='store_const',
const='apply_system',
help='reload sysctl settings from all config paths (sysctl --system)')
parser_check_host = subparsers.add_parser(
'check-host', help='check host configuration')
parser_check_host.set_defaults(func=command_check_host)
@ -5670,10 +5696,6 @@ def _get_parser():
'--expect-hostname',
help='Check that hostname matches an expected value')
parser_check_online = subparsers.add_parser(
'check-online', help='return true to indicate host is running')
parser_check_online.set_defaults(func=command_check_online)
parser_prepare_host = subparsers.add_parser(
'prepare-host', help='prepare a host for cephadm use')
parser_prepare_host.set_defaults(func=command_prepare_host)
@ -5808,28 +5830,6 @@ def _get_parser():
default=None,
help='numeric owner gid (requires --uid)')
parser_sysctl_dir = subparsers.add_parser(
'sysctl-dir',
help='list entries in sysctl.d or run sysctl --system')
parser_sysctl_dir.set_defaults(func=command_sysctl_dir)
parser_sysctl_dir.add_argument(
'--fsid',
help='cluster FSID')
_sysctl_dir_action = parser_sysctl_dir.add_mutually_exclusive_group(
required=True)
_sysctl_dir_action.add_argument(
'--list',
dest='sysctl_dir_action',
action='store_const',
const='list',
help=f'print one basename per line from {SYSCTL_DIR}')
_sysctl_dir_action.add_argument(
'--apply-system',
dest='sysctl_dir_action',
action='store_const',
const='apply_system',
help='reload sysctl settings from all config paths (sysctl --system)')
parser_maintenance = subparsers.add_parser(
'host-maintenance', help='Manage the maintenance state of a host')
parser_maintenance.add_argument(
@ -5975,6 +5975,8 @@ def main() -> None:
command_check_host,
command_check_online,
command_prepare_host,
command_setup_ssh_user,
command_prepare_host_sudo_hardening,
command_add_repo,
command_rm_repo,
command_install,

View File

@ -191,7 +191,7 @@ class TestCephAdm(object):
cephadm_fs.create_file(os.path.join(SYSCTL_DIR, 'c.conf'))
cephadm_fs.create_file(os.path.join(SYSCTL_DIR, 'a.conf'))
with with_cephadm_ctx(
['sysctl-dir', '--fsid', '00000000-0000-0000-0000-0000deadbeef', '--list']
['_orch', 'sysctl-dir', '--fsid', '00000000-0000-0000-0000-0000deadbeef', '--list']
) as ctx:
assert _cephadm.command_sysctl_dir(ctx) == 0
assert capsys.readouterr().out.splitlines() == ['a.conf', 'c.conf']
@ -204,14 +204,14 @@ class TestCephAdm(object):
shutil.rmtree(SYSCTL_DIR)
assert not cephadm_fs.exists(SYSCTL_DIR)
with with_cephadm_ctx(
['sysctl-dir', '--fsid', '00000000-0000-0000-0000-0000deadbeef', '--list']
['_orch', 'sysctl-dir', '--fsid', '00000000-0000-0000-0000-0000deadbeef', '--list']
) as ctx:
with pytest.raises(_cephadm.Error, match='Not a directory'):
_cephadm.command_sysctl_dir(ctx)
def test_command_sysctl_dir_apply_system(self, cephadm_fs):
with with_cephadm_ctx(
['sysctl-dir', '--fsid', '00000000-0000-0000-0000-0000deadbeef', '--apply-system']
['_orch', 'sysctl-dir', '--fsid', '00000000-0000-0000-0000-0000deadbeef', '--apply-system']
) as ctx:
assert _cephadm.command_sysctl_dir(ctx) == 0
@ -219,7 +219,7 @@ class TestCephAdm(object):
# Do not let with_cephadm_ctx re-patch cephadm.call back to success (exit 0).
with mock.patch('cephadm.call', return_value=('out', 'sysctl failed', 1)):
with with_cephadm_ctx(
['sysctl-dir', '--fsid', '00000000-0000-0000-0000-0000deadbeef', '--apply-system'],
['_orch', 'sysctl-dir', '--fsid', '00000000-0000-0000-0000-0000deadbeef', '--apply-system'],
mock_cephadm_call_fn=False,
) as ctx:
with pytest.raises(_cephadm.Error, match='sysctl --system failed'):

View File

@ -1197,7 +1197,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
def _setup_user_on_host(self, host: str, user: str, ssh_pub_key: str,
addr: Optional[str] = None) -> None:
"""
Setup sudoers and copy SSH key by calling cephadm setup-ssh-user command.
Setup sudoers and copy SSH key by calling cephadm setup-ssh-user.
User must already exist on the host.
For root user, only SSH key is copied (sudoers setup is skipped).
"""
@ -1582,7 +1582,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
addr: Optional[str] = None
) -> Tuple[str, bool, str]:
"""
Prepare a host for sudo hardening by executing 'cephadm prepare-host-sudo-hardening' command.
Prepare a host for sudo hardening by executing cephadm prepare-host-sudo-hardening.
"""
try:
self.log.debug('Preparing host %s for sudo hardening...', host)
@ -1591,7 +1591,10 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
with self.async_timeout_handler(host, 'cephadm prepare-host-sudo-hardening'):
out, err, code = self.wait_async(
CephadmServe(self)._run_cephadm(
host, cephadmNoImage, 'prepare-host-sudo-hardening', cephadm_args,
host,
cephadmNoImage,
'prepare-host-sudo-hardening',
cephadm_args,
addr=addr, error_ok=True, no_fsid=True))
if code:
error_msg = '\n'.join(err) if err else 'Unknown error'

View File

@ -41,10 +41,16 @@ class OfflineHostWatcher(threading.Thread):
def check_host(self, host: str) -> None:
if host not in self.mgr.offline_hosts:
try:
with self.mgr.async_timeout_handler(host, 'cephadm check-online'):
self.mgr.wait_async(CephadmServe(self.mgr)._run_cephadm(
host, cephadmNoImage, 'check-online', [],
no_fsid=True, log_output=self.mgr.log_refresh_metadata))
with self.mgr.async_timeout_handler(
host, 'cephadm _orch check-online'):
self.mgr.wait_async(
CephadmServe(self.mgr)._run_cephadm(
host,
cephadmNoImage,
['_orch', 'check-online'],
[],
no_fsid=True,
log_output=self.mgr.log_refresh_metadata))
except Exception:
logger.debug(f'OfflineHostDetector: detected {host} to be offline')
# kick serve loop in case corrective action must be taken for offline host

View File

@ -123,6 +123,6 @@ def test_offline_watcher_uses_cephadm_check_online(run_cephadm, cephadm_module):
cephadm_module.offline_watcher.check_host('test')
run_cephadm.assert_called_once_with(
'test', cephadmNoImage, 'check-online', [],
'test', cephadmNoImage, ['_orch', 'check-online'], [],
no_fsid=True, log_output=cephadm_module.log_refresh_metadata
)

View File

@ -13,7 +13,7 @@ logger = logging.getLogger(__name__)
SYSCTL_DIR = '/etc/sysctl.d'
SYSCTL_DIR_CEPHADM_CMD = 'sysctl-dir'
SYSCTL_DIR_CEPHADM_CMD = ['_orch', 'sysctl-dir']
class TunedProfileUtils():
@ -21,7 +21,7 @@ class TunedProfileUtils():
self.mgr = mgr
def _sysctl_dir_list(self, host: str) -> str:
with self.mgr.async_timeout_handler(host, 'cephadm sysctl-dir --list'):
with self.mgr.async_timeout_handler(host, 'cephadm _orch sysctl-dir --list'):
out, _err, _code = self.mgr.wait_async(CephadmServe(self.mgr)._run_cephadm(
host,
cephadmNoImage,
@ -32,7 +32,7 @@ class TunedProfileUtils():
return ''.join(out)
def _sysctl_dir_apply_system(self, host: str) -> None:
with self.mgr.async_timeout_handler(host, 'cephadm sysctl-dir --apply-system'):
with self.mgr.async_timeout_handler(host, 'cephadm _orch sysctl-dir --apply-system'):
self.mgr.wait_async(CephadmServe(self.mgr)._run_cephadm(
host,
cephadmNoImage,