from mgr_module import HandleCommandResult
from ceph.deployment.service_spec import NvmeofServiceSpec
-from orchestrator import OrchestratorError, DaemonDescription, DaemonDescriptionStatus
+from orchestrator import (
+ OrchestratorError,
+ DaemonDescription,
+ DaemonDescriptionStatus,
+ HostSpec,
+)
from .cephadmservice import CephadmDaemonDeploySpec, CephService
from .service_registry import register_cephadm_service
from .. import utils
_, _, err = self.mgr.mon_command(cmd)
if err:
self.mgr.log.error(f"Unable to send monitor command {cmd}, error {err}")
+
+ def get_blocking_daemon_hosts(self, service_name: str) -> List[HostSpec]:
+ # we should not deploy nvmeof daemons on hosts that have nvmeof daemons
+ # from services with a different "group" attribute (as recommended by
+ # the nvmeof team)
+ spec = cast(NvmeofServiceSpec, self.mgr.spec_store[service_name].spec)
+ nvmeof_group = cast(NvmeofServiceSpec, spec).group
+ blocking_daemons: List[DaemonDescription] = []
+ other_group_nvmeof_services = [
+ nspec for nspec in self.mgr.spec_store.get_specs_by_type('nvmeof').values()
+ if cast(NvmeofServiceSpec, nspec).group != nvmeof_group
+ ]
+ for other_group_nvmeof_service in other_group_nvmeof_services:
+ blocking_daemons += self.mgr.cache.get_daemons_by_service(other_group_nvmeof_service.service_name())
+ blocking_daemon_hosts = [
+ HostSpec(hostname=blocking_daemon.hostname)
+ for blocking_daemon in blocking_daemons if blocking_daemon.hostname is not None
+ ]
+ return blocking_daemon_hosts