gen,
)
- def matches_daemon(self, dd: DaemonDescription) -> bool:
+ def matches_daemon(self, dd: DaemonDescription, upgrade_in_progress: bool = False) -> bool:
if self.daemon_type != dd.daemon_type:
return False
if self.hostname != dd.hostname:
# fixme: how to match against network?
if self.name and self.name != dd.daemon_id:
return False
- if self.ports:
- if self.ports != dd.ports and dd.ports:
- return False
- if self.ip != dd.ip and dd.ip:
- return False
+ # only consider daemon "not matching" on port/ip
+ # differences if we're not mid upgrade. During upgrade
+ # it's very likely we'll deploy the daemon with the
+ # new port/ips as part of the upgrade process
+ if not upgrade_in_progress:
+ if self.ports:
+ if self.ports != dd.ports and dd.ports:
+ return False
+ if self.ip != dd.ip and dd.ip:
+ return False
return True
def matches_rank_map(
per_host_daemon_type: Optional[str] = None,
rank_map: Optional[Dict[int, Dict[int, Optional[str]]]] = None,
blocking_daemon_hosts: Optional[List[orchestrator.HostSpec]] = None,
+ upgrade_in_progress: bool = False
):
assert spec
self.spec = spec # type: ServiceSpec
self.per_host_daemon_type = per_host_daemon_type
self.ports_start = spec.get_port_start()
self.rank_map = rank_map
+ self.upgrade_in_progress = upgrade_in_progress
def hosts_by_label(self, label: str) -> List[orchestrator.HostSpec]:
return [h for h in self.hosts if label in h.labels]
for dd in existing:
found = False
for p in host_slots:
- if p.matches_daemon(dd):
+ if p.matches_daemon(dd, self.upgrade_in_progress):
host_slots.remove(p)
found = True
break
for dd in daemons:
found = False
for p in others:
- if p.matches_daemon(dd) and p.matches_rank_map(dd, self.rank_map, ranks):
+ if p.matches_daemon(dd, self.upgrade_in_progress) and p.matches_rank_map(dd, self.rank_map, ranks):
others.remove(p)
if dd.is_active:
existing_active.append(dd)