from ceph.deployment.service_spec import IngressSpec
from cephadm.utils import resolve_ip
-
+from orchestrator import OrchestratorError
from cephadm.services.cephadmservice import CephadmDaemonDeploySpec, CephService
logger = logging.getLogger(__name__)
) -> Tuple[Dict[str, Any], List[str]]:
spec = cast(IngressSpec, self.mgr.spec_store[daemon_spec.service_name].spec)
assert spec.backend_service
+ if spec.backend_service not in self.mgr.spec_store:
+ raise RuntimeError(f'{spec.service_name()} backend service {spec.backend_service} does not exist')
+ backend_spec = self.mgr.spec_store[spec.backend_service].spec
daemons = self.mgr.cache.get_daemons_by_service(spec.backend_service)
deps = [d.name() for d in daemons]
if spec.monitor_password:
password = spec.monitor_password
+ if backend_spec.service_type == 'nfs':
+ mode = 'tcp'
+ by_rank = {d.rank: d for d in daemons if d.rank is not None}
+ servers = []
+
+ # try to establish how many ranks we *should* have
+ num_ranks = backend_spec.placement.count
+ if not num_ranks:
+ num_ranks = 1 + max(by_rank.keys())
+
+ for rank in range(num_ranks):
+ if rank in by_rank:
+ d = by_rank[rank]
+ assert(d.ports)
+ servers.append({
+ 'name': f"{spec.backend_service}.{rank}",
+ 'ip': d.ip or resolve_ip(self.mgr.inventory.get_addr(str(d.hostname))),
+ 'port': d.ports[0],
+ })
+ else:
+ # offline/missing server; leave rank in place
+ servers.append({
+ 'name': f"{spec.backend_service}.{rank}",
+ 'ip': '0.0.0.0',
+ 'port': 0,
+ })
+ else:
+ mode = 'http'
+ servers = [
+ {
+ 'name': d.name(),
+ 'ip': d.ip or resolve_ip(self.mgr.inventory.get_addr(str(d.hostname))),
+ 'port': d.ports[0],
+ } for d in daemons if d.ports
+ ]
+
haproxy_conf = self.mgr.template.render(
'services/ingress/haproxy.cfg.j2',
{
'spec': spec,
- 'servers': [
- {
- 'name': d.name(),
- 'ip': d.ip or resolve_ip(str(d.hostname)),
- 'port': d.ports[0],
- } for d in daemons if d.ports
- ],
+ 'mode': mode,
+ 'servers': servers,
'user': spec.monitor_user or 'admin',
'password': password,
'ip': daemon_spec.ip or '*',
)
break
if not interface:
- interface = 'eth0'
+ raise OrchestratorError(
+ f"Unable to identify interface for {spec.virtual_ip} on {host}"
+ )
# script to monitor health
script = '/usr/bin/false'
# remove host, daemon is being deployed on from hosts list for
# other_ips in conf file and converter to ips
- hosts.remove(host)
- other_ips = [resolve_ip(h) for h in hosts]
+ if host in hosts:
+ hosts.remove(host)
+ other_ips = [resolve_ip(self.mgr.inventory.get_addr(h)) for h in hosts]
keepalived_conf = self.mgr.template.render(
'services/ingress/keepalived.conf.j2',
'interface': interface,
'state': state,
'other_ips': other_ips,
- 'host_ip': resolve_ip(host),
+ 'host_ip': resolve_ip(self.mgr.inventory.get_addr(host)),
}
)