None,
False
),
+ ( # invalid, can't upgrade crash on a while mon on a is not upgraded
+ [('mgr', 'a', 'a.x')],
+ [('mon', 'a', 'a'), ('crash', 'a', 'a')],
+ ['crash'],
+ ['a'],
+ None,
+ True
+ ),
+ ( # invalid, can't upgrade crash on a while mgr on a is not upgraded
+ [('mon', 'a', 'a')],
+ [('mgr', 'a', 'a.x'), ('crash', 'a', 'a')],
+ ['crash'],
+ ['a'],
+ None,
+ True
+ ),
+ ( # invalid, can't upgrade crash service on a while mon on a is not upgraded
+ [('mgr', 'a', 'a.x')],
+ [('mon', 'a', 'a'), ('crash', 'a', 'a')],
+ None,
+ ['a'],
+ ['crash'],
+ True
+ ),
]
)
@mock.patch("cephadm.module.HostCache.get_daemons")
get_image_info,
get_daemons,
upgraded: List[Tuple[str, str, str]],
- not_upgraded: List[Tuple[str, str, str, str]],
+ not_upgraded: List[Tuple[str, str, str]],
daemon_types: Optional[str],
hosts: Optional[str],
services: Optional[str],
should_block: bool,
cephadm_module: CephadmOrchestrator,
):
- def to_dds(ts: List[Tuple[str, str]], upgraded: bool) -> List[DaemonDescription]:
+ def to_dds(ts: List[Tuple[str, str, str]], upgraded: bool) -> List[DaemonDescription]:
dds = []
digest = 'new_image@repo_digest' if upgraded else 'old_image@repo_digest'
for t in ts:
earlier_types = [t for t in earlier_types if t not in dtypes]
return [d for d in candidates if d.daemon_type in earlier_types]
+ def _filter_by_hosts(daemons: List[DaemonDescription], hosts: List[str], on_hosts: bool) -> List[DaemonDescription]:
+ if on_hosts:
+ return [d for d in daemons if d.hostname is not None and d.hostname in hosts]
+ return [d for d in daemons if d.hostname is not None and d.hostname not in hosts]
+
if self.upgrade_state:
raise OrchestratorError(
'Cannot set values for --daemon-types, --services or --hosts when upgrade already in progress.')
if daemon_types is not None:
dtypes = daemon_types
if hosts is not None:
- same_host_daemons = [
- d for d in daemons if d.hostname is not None and d.hostname in hosts]
- other_host_daemons = [
- d for d in daemons if d.hostname is not None and d.hostname not in hosts]
- daemons = (_get_earlier_daemons([_latest_type(dtypes)], other_host_daemons)
- + _get_earlier_daemons(dtypes, same_host_daemons))
+ daemons = (_get_earlier_daemons([_latest_type(dtypes)], _filter_by_hosts(daemons, hosts, False))
+ + _get_earlier_daemons(dtypes, _filter_by_hosts(daemons, hosts, True)))
else:
daemons = _get_earlier_daemons(dtypes, daemons)
err_msg_base += 'Daemons with types earlier in upgrade order than given types need upgrading.\n'
dtypes += orchestrator.service_to_daemon_types(stype)
dtypes = list(set(dtypes))
if hosts is not None:
- same_host_daemons = [
- d for d in daemons if d.hostname is not None and d.hostname in hosts]
- other_host_daemons = [
- d for d in daemons if d.hostname is not None and d.hostname not in hosts]
- daemons = (_get_earlier_daemons([_latest_type(dtypes)], other_host_daemons)
- + _get_earlier_daemons(dtypes, same_host_daemons))
+ daemons = (_get_earlier_daemons([_latest_type(dtypes)], _filter_by_hosts(daemons, hosts, False))
+ + _get_earlier_daemons(dtypes, _filter_by_hosts(daemons, hosts, True)))
else:
daemons = _get_earlier_daemons(dtypes, daemons)
err_msg_base += 'Daemons with types earlier in upgrade order than daemons from given services need upgrading.\n'