示例#1
0
    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
示例#2
0
文件: serve.py 项目: zqlzhang511/ceph
 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
示例#3
0
 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
示例#4
0
 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)