def load(self): # type: () -> None for k, v in self.mgr.get_store_prefix(HOST_CACHE_PREFIX).items(): host = k[len(HOST_CACHE_PREFIX):] if host not in self.mgr.inventory: self.mgr.log.warning( 'removing stray HostCache host record %s' % (host)) self.mgr.set_store(k, None) try: j = json.loads(v) if 'last_device_update' in j: self.last_device_update[host] = str_to_datetime( j['last_device_update']) else: self.device_refresh_queue.append(host) # for services, we ignore the persisted last_*_update # and always trigger a new scrape on mgr restart. self.daemon_refresh_queue.append(host) self.daemons[host] = {} self.osdspec_previews[host] = [] self.devices[host] = [] self.networks[host] = {} self.daemon_config_deps[host] = {} for name, d in j.get('daemons', {}).items(): self.daemons[host][name] = \ orchestrator.DaemonDescription.from_json(d) 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', []), 'last_config': str_to_datetime(d['last_config']), } if 'last_host_check' in j: self.last_host_check[host] = str_to_datetime( j['last_host_check']) if 'last_etc_ceph_ceph_conf' in j: self.last_etc_ceph_ceph_conf[host] = str_to_datetime( j['last_etc_ceph_ceph_conf']) self.registry_login_queue.add(host) self.scheduled_daemon_actions[host] = j.get( 'scheduled_daemon_actions', {}) self.mgr.log.debug( 'HostCache.load: host %s has %d daemons, ' '%d devices, %d networks' % (host, len(self.daemons[host]), len( self.devices[host]), len(self.networks[host]))) except Exception as e: self.mgr.log.warning('unable to load cached state for %s: %s' % (host, e)) pass
def _refresh_host_daemons(self, host: str) -> Optional[str]: try: out, err, code = self.mgr._run_cephadm(host, 'mon', 'ls', [], no_fsid=True) if code: return 'host %s cephadm ls returned %d: %s' % (host, code, err) ls = json.loads(''.join(out)) except ValueError: msg = 'host %s scrape failed: Cannot decode JSON' % host self.log.exception('%s: \'%s\'' % (msg, ''.join(out))) return msg except Exception as e: return 'host %s scrape failed: %s' % (host, e) dm = {} for d in ls: if not d['style'].startswith('cephadm'): continue if d['fsid'] != self.mgr._cluster_fsid: continue if '.' not in d['name']: continue sd = orchestrator.DaemonDescription() sd.last_refresh = datetime.datetime.utcnow() for k in [ 'created', 'started', 'last_configured', 'last_deployed' ]: v = d.get(k, None) if v: setattr(sd, k, str_to_datetime(d[k])) sd.daemon_type = d['name'].split('.')[0] sd.daemon_id = '.'.join(d['name'].split('.')[1:]) sd.hostname = host sd.container_id = d.get('container_id') if sd.container_id: # shorten the hash sd.container_id = sd.container_id[0:12] sd.container_image_name = d.get('container_image_name') sd.container_image_id = d.get('container_image_id') sd.version = d.get('version') if sd.daemon_type == 'osd': sd.osdspec_affinity = self.mgr.osd_service.get_osdspec_affinity( sd.daemon_id) if 'state' in d: sd.status_desc = d['state'] sd.status = { 'running': 1, 'stopped': 0, 'error': -1, 'unknown': -1, }[d['state']] else: sd.status_desc = 'unknown' sd.status = None dm[sd.name()] = sd self.log.debug('Refreshed host %s daemons (%d)' % (host, len(dm))) self.mgr.cache.update_host_daemons(host, dm) self.mgr.cache.save_host(host) return None
def load(self): # type: () -> None for k, v in self.mgr.get_store_prefix(SPEC_STORE_PREFIX).items(): service_name = k[len(SPEC_STORE_PREFIX):] try: v = json.loads(v) spec = ServiceSpec.from_json(v['spec']) created = str_to_datetime(v['created']) self.specs[service_name] = spec self.spec_created[service_name] = created self.mgr.log.debug('SpecStore: loaded spec for %s' % (service_name)) except Exception as e: self.mgr.log.warning('unable to load spec for %s: %s' % (service_name, e)) pass
def from_json(cls, inp: Optional[Dict[str, Any]], ctx: Optional[RemoveUtil] = None) -> Optional["OSD"]: if not inp: return None for date_field in [ 'drain_started_at', 'drain_stopped_at', 'drain_done_at', 'process_started_at' ]: if inp.get(date_field): inp.update( {date_field: str_to_datetime(inp.get(date_field, ''))}) inp.update({'remove_util': ctx}) if 'nodename' in inp: hostname = inp.pop('nodename') inp['hostname'] = hostname return cls(**inp)