]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: add preview caching to inventory.py
authorJoshua Schmid <jschmid@suse.de>
Fri, 15 May 2020 09:32:03 +0000 (11:32 +0200)
committerJoshua Schmid <jschmid@suse.de>
Fri, 15 May 2020 09:32:03 +0000 (11:32 +0200)
Signed-off-by: Joshua Schmid <jschmid@suse.de>
src/pybind/mgr/cephadm/inventory.py

index 3cfe74f41cb1d7c79287af6e607217667ea6aa70..d4e6dc797b59b26232c397f6385ceca3dea78fff 100644 (file)
@@ -163,12 +163,15 @@ class HostCache():
         self.daemons = {}   # type: Dict[str, Dict[str, orchestrator.DaemonDescription]]
         self.last_daemon_update = {}   # type: Dict[str, datetime.datetime]
         self.devices = {}              # type: Dict[str, List[inventory.Device]]
+        self.osdspec_previews = {}     # type: Dict[str, List[Dict[str, Any]]]
         self.networks = {}             # type: Dict[str, Dict[str, List[str]]]
         self.last_device_update = {}   # type: Dict[str, datetime.datetime]
         self.daemon_refresh_queue = [] # type: List[str]
         self.device_refresh_queue = [] # type: List[str]
+        self.osdspec_previews_refresh_queue = [] # type: List[str]
         self.daemon_config_deps = {}   # type: Dict[str, Dict[str, Dict[str,Any]]]
         self.last_host_check = {}      # type: Dict[str, datetime.datetime]
+        self.loading_osdspec_preview = {}  # type: Dict[str, bool]
 
     def load(self):
         # type: () -> None
@@ -189,6 +192,8 @@ class HostCache():
                 # and always trigger a new scrape on mgr restart.
                 self.daemon_refresh_queue.append(host)
                 self.daemons[host] = {}
+                self.osdspec_previews[host] = []
+                self.loading_osdspec_preview[host] = False
                 self.devices[host] = []
                 self.networks[host] = {}
                 self.daemon_config_deps[host] = {}
@@ -198,6 +203,8 @@ class HostCache():
                 for d in j.get('devices', []):
                     self.devices[host].append(inventory.Device.from_json(d))
                 self.networks[host] = j.get('networks', {})
+                self.osdspec_previews[host] = j.get('osdspec_previews', [])
+
                 for name, d in j.get('daemon_config_deps', {}).items():
                     self.daemon_config_deps[host][name] = {
                         'deps': d.get('deps', []),
@@ -217,6 +224,19 @@ class HostCache():
                     host, e))
                 pass
 
+    def update_osdspec_previews(self, search_host: str = ''):
+        # Set global 'pending' flag for host
+        self.loading_osdspec_preview[search_host] = True
+        previews = []
+        # query OSDSpecs for host <search host> and generate/get the preview
+        for preview in self.mgr.osd_service.get_previews(search_host):
+            # There can be multiple previews for one host due to multiple OSDSpecs.
+            previews.append(preview)
+        self.mgr.log.debug(f"Loading OSDSpec previews to HostCache")
+        self.osdspec_previews[search_host] = previews
+        # Unset global 'pending' flag for host
+        self.loading_osdspec_preview[search_host] = False
+
     def update_host_daemons(self, host, dm):
         # type: (str, Dict[str, orchestrator.DaemonDescription]) -> None
         self.daemons[host] = dm
@@ -246,9 +266,11 @@ class HostCache():
         self.daemons[host] = {}
         self.devices[host] = []
         self.networks[host] = {}
+        self.osdspec_previews[host] = []
         self.daemon_config_deps[host] = {}
         self.daemon_refresh_queue.append(host)
         self.device_refresh_queue.append(host)
+        self.osdspec_previews_refresh_queue.append(host)
 
     def invalidate_host_daemons(self, host):
         # type: (str) -> None
@@ -269,6 +291,7 @@ class HostCache():
         j = {   # type: ignore
             'daemons': {},
             'devices': [],
+            'osdspec_previews': [],
             'daemon_config_deps': {},
         }
         if host in self.last_daemon_update:
@@ -285,8 +308,11 @@ class HostCache():
                 'deps': depi.get('deps', []),
                 'last_config': depi['last_config'].strftime(DATEFMT),
             }
+        if self.osdspec_previews[host]:
+            j['osdspec_previews'] = self.osdspec_previews[host]
+
         if host in self.last_host_check:
-            j['last_host_check']= self.last_host_check[host].strftime(DATEFMT)
+            j['last_host_check'] = self.last_host_check[host].strftime(DATEFMT)
         self.mgr.set_store(HOST_CACHE_PREFIX + host, json.dumps(j))
 
     def rm_host(self, host):
@@ -295,6 +321,10 @@ class HostCache():
             del self.daemons[host]
         if host in self.devices:
             del self.devices[host]
+        if host in self.osdspec_previews:
+            del self.osdspec_previews[host]
+        if host in self.loading_osdspec_preview:
+            del self.loading_osdspec_preview[host]
         if host in self.networks:
             del self.networks[host]
         if host in self.last_daemon_update:
@@ -384,6 +414,17 @@ class HostCache():
             return True
         return False
 
+    def host_needs_osdspec_preview_refresh(self, host):
+        if host in self.mgr.offline_hosts:
+            logger.debug(f'Host "{host}" marked as offline. Skipping osdspec preview refresh')
+            return False
+        if host in self.osdspec_previews_refresh_queue:
+            self.osdspec_previews_refresh_queue.remove(host)
+            return True
+        #  Since this is dependent on other factors (device and spec) this does not  need
+        #  to be updated periodically.
+        return False
+
     def host_needs_check(self, host):
         # type: (str) -> bool
         cutoff = datetime.datetime.utcnow() - datetime.timedelta(