def __init__(self): self._complete = gevent.event.Event() self._rpc_thread = RpcThread(self) self._discovery_thread = TopLevelEvents(self) self._process_monitor = ProcessMonitorThread() db_path = config.get('cthulhu', 'db_path') if sqlalchemy is not None and db_path: try: # Prepare persistence engine = create_engine(config.get('cthulhu', 'db_path')) # noqa Session.configure(bind=engine) self.persister = Persister() except sqlalchemy.exc.ArgumentError as e: log.error("Database error: %s" % e) raise else: class NullPersister(object): def start(self): pass def stop(self): pass def join(self): pass def __getattribute__(self, item): if item.startswith('_'): return object.__getattribute__(self, item) else: try: return object.__getattribute__(self, item) except AttributeError: def blackhole(*args, **kwargs): pass return blackhole self.persister = NullPersister() # Remote operations self.requests = RequestCollection(self) self._request_ticker = Ticker(request_collection.TICK_PERIOD, lambda: self.requests.tick()) # FSID to ClusterMonitor self.clusters = {} # Generate events on state changes self.eventer = Eventer(self) # Handle all ceph/server messages self.servers = ServerMonitor(self.persister, self.eventer, self.requests)
def __init__(self, fsid, cluster_name, notifier, persister, servers, eventer): super(ClusterMonitor, self).__init__() self.fsid = fsid self.name = cluster_name self.update_time = datetime.datetime.utcnow().replace(tzinfo=utc) self._notifier = notifier self._persister = persister self._servers = servers self._eventer = eventer # Which mon we are currently using for running requests, # identified by minion ID self._favorite_mon = None self._last_heartbeat = {} self._complete = gevent.event.Event() self.done = gevent.event.Event() self._sync_objects = SyncObjects(self.name) self._requests = RequestCollection(self._sync_objects, eventer) self._derived_objects = DerivedObjects() self._request_factories = { OSD: OsdRequestFactory, POOL: PoolRequestFactory } self._plugin_monitor = PluginMonitor(servers) self._ready = gevent.event.Event() self._request_ticker = Ticker(request_collection.TICK_PERIOD, lambda: self._requests.tick())