]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/cephadm/services/ingress.py
import ceph pacific 16.2.5
[ceph.git] / ceph / src / pybind / mgr / cephadm / services / ingress.py
index 639bef5a57db560f173d29fb83adf13f1d671c4b..f78f558a2d8f8a309375456c9bce09a7147b0a20 100644 (file)
@@ -6,7 +6,7 @@ from typing import List, Dict, Any, Tuple, cast, Optional
 
 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__)
@@ -64,6 +64,9 @@ class IngressService(CephService):
     ) -> 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]
 
@@ -80,17 +83,48 @@ class IngressService(CephService):
         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 '*',
@@ -175,7 +209,9 @@ class IngressService(CephService):
                     )
                     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'
@@ -194,8 +230,9 @@ class IngressService(CephService):
 
         # 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',
@@ -206,7 +243,7 @@ class IngressService(CephService):
                 'interface': interface,
                 'state': state,
                 'other_ips': other_ips,
-                'host_ip': resolve_ip(host),
+                'host_ip': resolve_ip(self.mgr.inventory.get_addr(host)),
             }
         )