]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: allow to map existing daemons to osdspecs
authorJoshua Schmid <jschmid@suse.de>
Tue, 14 Jul 2020 15:01:13 +0000 (17:01 +0200)
committerJoshua Schmid <jschmid@suse.de>
Mon, 3 Aug 2020 08:04:53 +0000 (10:04 +0200)
Fixes: https://tracker.ceph.com/issues/44888
Signed-off-by: Joshua Schmid <jschmid@suse.de>
src/pybind/mgr/cephadm/services/osd.py
src/python-common/ceph/deployment/drive_selection/selector.py

index 3a7297bdc442f46a1e54a1934ed5e18b9197ba76..b41fc6072c390ddb89218215cb3e51ae715bff7f 100644 (file)
@@ -124,13 +124,14 @@ class OSDService(CephadmService):
         for host in matching_hosts:
             inventory_for_host = _find_inv_for_host(host, self.mgr.cache.devices)
             logger.debug(f"Found inventory for host {inventory_for_host}")
-            drive_selection = DriveSelection(drive_group, inventory_for_host)
+            drive_selection = DriveSelection(drive_group, inventory_for_host,
+                                             self.mgr.cache.get_daemons_with_volatile_status())
             logger.debug(f"Found drive selection {drive_selection}")
             host_ds_map.append((host, drive_selection))
         return host_ds_map
 
-    def driveselection_to_ceph_volume(self,
-                                      drive_selection: DriveSelection,
+    @staticmethod
+    def driveselection_to_ceph_volume(drive_selection: DriveSelection,
                                       osd_id_claims: Optional[List[str]] = None,
                                       preview: bool = False) -> Optional[str]:
         logger.debug(f"Translating DriveGroup <{drive_selection.spec}> to ceph-volume command")
index 921f125616c25fd925a16f74bc6fef6c22273001..255d652777cbc7a98ffae1b48e0b86fe7b3503d6 100644 (file)
@@ -1,7 +1,7 @@
 import logging
 
 try:
-    from typing import List, Optional
+    from typing import List, Optional, Iterator, Tuple, Dict
 except ImportError:
     pass
 
@@ -17,9 +17,12 @@ class DriveSelection(object):
     def __init__(self,
                  spec,  # type: DriveGroupSpec
                  disks,  # type: List[Device]
+                 daemons=None,  # type: Iterator[Tuple[str, Dict[str, "DaemonDescription"]]]
                  ):
         self.disks = disks.copy()
         self.spec = spec
+        self.daemons = daemons
+        self.osds_for_spec = self.find_osds_in_spec()
 
         if self.spec.data_devices.paths:  # type: ignore
             # re: type: ignore there is *always* a path attribute assigned to DeviceSelection
@@ -34,6 +37,17 @@ class DriveSelection(object):
             self._db = self.assign_devices(self.spec.db_devices)
             self._journal = self.assign_devices(self.spec.journal_devices)
 
+    def find_osds_in_spec(self) -> List["DaemonDescription"]:
+        osds: List["DaemonDescription"] = []
+        if not self.daemons:
+            return osds
+        for host, dm in self.daemons:
+            for name, dd in dm.items():
+                if dd.daemon_type == 'osd':
+                    if dd.osdspec_affinity == self.spec.service_id:
+                        osds.append(dd)
+        return osds
+
     def data_devices(self):
         # type: () -> List[Device]
         return self._data
@@ -50,8 +64,7 @@ class DriveSelection(object):
         # type: () -> List[Device]
         return self._journal
 
-    @staticmethod
-    def _limit_reached(device_filter, len_devices,
+    def _limit_reached(self, device_filter, len_devices,
                        disk_path):
         # type: (DeviceSelection, int, str) -> bool
         """ Check for the <limit> property and apply logic