]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/ssh: allow names to be specified for stateless services
authorSage Weil <sage@redhat.com>
Mon, 11 Nov 2019 23:27:57 +0000 (17:27 -0600)
committerSage Weil <sage@redhat.com>
Tue, 12 Nov 2019 15:00:52 +0000 (09:00 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/pybind/mgr/orchestrator.py
src/pybind/mgr/ssh/module.py

index fb634eac7c70bb93ba2f3400ca3d8628378b3309..5ef1338ecafac16b969625eedd662f40fae60e87 100644 (file)
@@ -597,8 +597,18 @@ class PlacementSpec(object):
     """
     def __init__(self, label=None, nodes=[]):
         self.label = label
-        self.nodes = nodes
 
+        def split_host(host):
+            """Split host into host and name parts"""
+            # TODO: stricter validation
+            a = host.split('=', 1)
+            if len(a) == 1:
+                return (a[0], None)
+            else:
+                assert len(a) == 2
+                return tuple(a)
+
+        self.nodes = list(map(split_host, nodes))
 
 def handle_type_error(method):
     @wraps(method)
index d648679db7693a7c067fb5fc5f85e5810c1f7c50..d83a2715e20cff24acbfd291140e4ae2e13bc304 100644 (file)
@@ -200,10 +200,15 @@ class SSHOrchestrator(MgrModule, orchestrator.OrchestratorClientMixin):
                     self.get_ceph_option(opt))
             self.log.debug(' native option %s = %s', opt, getattr(self, opt))
 
-    def get_unique_name(self, existing, prefix=None):
+    def get_unique_name(self, existing, prefix=None, forcename=None):
         """
         Generate a unique random service name
         """
+        if forcename:
+            if len([d for d in existing if d.service_instance == name]):
+                raise RuntimeError('specified name %s already in use', name)
+            return forcename
+
         while True:
             if prefix:
                 name = prefix + '.'
@@ -1015,10 +1020,10 @@ class SSHOrchestrator(MgrModule, orchestrator.OrchestratorClientMixin):
         daemons = self._get_services('mds')
         results = []
         num_added = 0
-        for host in spec.placement.nodes:
+        for host, name in spec.placement.nodes:
             if num_added >= spec.count:
                 break
-            mds_id = self.get_unique_name(daemons, spec.name)
+            mds_id = self.get_unique_name(daemons, spec.name, name)
             self.log.debug('placing mds.%s on host %s' % (mds_id, host))
             results.append(
                 self._worker_pool.apply_async(self._create_mds, (mds_id, host))
@@ -1072,10 +1077,10 @@ class SSHOrchestrator(MgrModule, orchestrator.OrchestratorClientMixin):
         daemons = self._get_services('rgw')
         results = []
         num_added = 0
-        for host in spec.placement.nodes:
+        for host, name in spec.placement.nodes:
             if num_added >= spec.count:
                 break
-            rgw_id = self.get_unique_name(daemons, spec.name)
+            rgw_id = self.get_unique_name(daemons, spec.name, name)
             self.log.debug('placing rgw.%s on host %s' % (rgw_id, host))
             results.append(
                 self._worker_pool.apply_async(self._create_rgw, (rgw_id, host))
@@ -1118,13 +1123,14 @@ class SSHOrchestrator(MgrModule, orchestrator.OrchestratorClientMixin):
     def add_rbd_mirror(self, spec):
         if not spec.placement.nodes or len(spec.placement.nodes) < spec.count:
             raise RuntimeError("must specify at least %d hosts" % spec.count)
+        self.log.debug('nodes %s' % spec.placement.nodes)
         daemons = self._get_services('rbd-mirror')
         results = []
         num_added = 0
-        for host in spec.placement.nodes:
+        for host, name in spec.placement.nodes:
             if num_added >= spec.count:
                 break
-            daemon_id = self.get_unique_name(daemons)
+            daemon_id = self.get_unique_name(daemons, None, name)
             self.log.debug('placing rbd-mirror.%s on host %s' % (daemon_id,
                                                                  host))
             results.append(