def start(self): from twisted.internet.defer import Deferred from logs import lg from main.config import conf from main import events from raid import eccmap from services import driver from customer import fire_hire self.starting_deferred = Deferred() self.starting_deferred.addErrback( lambda err: lg.warn('service %r was not started: %r' % (self.service_name, err.getErrorMessage() if err else 'unknown reason'))) self.all_suppliers_hired_event_sent = False if driver.is_on('service_entangled_dht'): self._do_join_suppliers_dht_layer() eccmap.Update() fire_hire.A('init') fire_hire.A().addStateChangedCallback(self._on_fire_hire_ready, None, 'READY') conf().addConfigNotifier('services/customer/suppliers-number', self._on_suppliers_number_modified) conf().addConfigNotifier('services/customer/needed-space', self._on_needed_space_modified) events.add_subscriber(self._on_supplier_modified, 'supplier-modified') events.add_subscriber(self._on_dht_layer_connected, event_id='dht-layer-connected') if fire_hire.IsAllHired(): self.starting_deferred.callback(True) self.starting_deferred = None lg.info('all my suppliers are already hired') return True fire_hire.A('restart') return self.starting_deferred
def doRestartFireHire(self, *args, **kwargs): """ Action method. """ if driver.is_on('service_employer'): from customer import fire_hire fire_hire.A('restart')
def doSupplierConnect(self, *args, **kwargs): """ Action method. """ from customer import supplier_connector from customer import fire_hire from raid import eccmap position = self.family_position if position is None or position == -1: lg.warn('position for new supplier is unknown, will "guess"') current_suppliers = list(contactsdb.suppliers()) for i in range(len(current_suppliers)): supplier_idurl = current_suppliers[i].to_bin() if not supplier_idurl: position = i break if id_url.is_in(supplier_idurl, fire_hire.A().dismiss_list, as_field=False): position = i break sc = supplier_connector.by_idurl(self.target_idurl) if not sc: sc = supplier_connector.create( supplier_idurl=self.target_idurl, customer_idurl=my_id.getIDURL(), ) sc.set_callback('supplier_finder', self._supplier_connector_state) sc.automat( 'connect', family_position=position, ecc_map=(self.ecc_map or eccmap.Current().name), family_snapshot=self.family_snapshot, )
def _on_needed_space_modified(self, path, value, oldvalue, result): from logs import lg from customer import fire_hire lg.info('my needed space value modified') self._do_check_all_hired() fire_hire.ClearLastFireTime() fire_hire.A('restart')
def doSupplierConnect(self, *args, **kwargs): """ Action method. """ from customer import supplier_connector from customer import fire_hire from raid import eccmap position = self.family_position if not position: lg.warn('position for new supplier is unknown, will "guess"') current_suppliers = list(contactsdb.suppliers()) for i in range(len(current_suppliers)): if not current_suppliers[i].strip(): position = i break if current_suppliers[i] in fire_hire.A().dismiss_list: position = i break sc = supplier_connector.by_idurl(self.target_idurl) if not sc: sc = supplier_connector.create( supplier_idurl=self.target_idurl, customer_idurl=my_id.getLocalID(), ) sc.automat( 'connect', family_position=position, ecc_map=(self.ecc_map or eccmap.Current().name), family_snapshot=self.family_snapshot, ) sc.set_callback('supplier_finder', self._supplier_connector_state)
def _on_suppliers_number_modified(self, path, value, oldvalue, result): from logs import lg from customer import fire_hire from raid import eccmap lg.info('my desired suppliers number changed') eccmap.Update() self._do_check_all_hired() fire_hire.ClearLastFireTime() fire_hire.A('restart')
def start(self): from customer import fire_hire from main.config import conf fire_hire.A('init') conf().addCallback('services/customer/suppliers-number', self._on_suppliers_number_modified) conf().addCallback('services/customer/needed-space', self._on_needed_space_modified) return True
def stop(self): from main.config import conf from main import events from customer import fire_hire fire_hire.A().removeStateChangedCallback(self._on_fire_hire_ready) events.remove_subscriber(self._on_dht_layer_connected, event_id='dht-layer-connected') events.remove_subscriber(self._on_supplier_modified, 'supplier-modified') conf().removeConfigNotifier('services/customer/suppliers-number') conf().removeConfigNotifier('services/customer/needed-space') fire_hire.Destroy() return True
def start(self): from customer import fire_hire from main.config import conf from main import events from raid import eccmap eccmap.Update() fire_hire.A('init') conf().addCallback('services/customer/suppliers-number', self._on_suppliers_number_modified) conf().addCallback('services/customer/needed-space', self._on_needed_space_modified) events.add_subscriber(self._on_supplier_modified, 'supplier-modified') self._do_cleanup_dht_suppliers() return True
def _on_needed_space_modified(self, path, value, oldvalue, result): from customer import fire_hire fire_hire.ClearLastFireTime() fire_hire.A('restart')
def _on_suppliers_number_modified(self, path, value, oldvalue, result): from customer import fire_hire from raid import eccmap eccmap.Update() fire_hire.ClearLastFireTime() fire_hire.A('restart')
def A(self, event, *args, **kwargs): from customer import fire_hire from customer import data_sender from customer import list_files_orator from storage import backup_rebuilder from storage import index_synchronizer #---READY--- if self.state == 'READY': if event == 'timer-5sec': self.doOverallCheckUp(*args, **kwargs) elif event == 'restart' or event == 'suppliers-changed' or ( event == 'instant' and self.RestartAgain): self.state = 'FIRE_HIRE' self.RestartAgain = False self.doRememberSuppliers(*args, **kwargs) fire_hire.A('restart') #---LIST_FILES--- elif self.state == 'LIST_FILES': if (event == 'list_files_orator.state' and args[0] == 'NO_FILES'): self.state = 'READY' elif (event == 'list_files_orator.state' and args[0] == 'SAW_FILES'): self.state = 'LIST_BACKUPS' index_synchronizer.A('pull') data_sender.A('restart') self.doPrepareListBackups(*args, **kwargs) elif event == 'restart': self.RestartAgain = True elif event == 'suppliers-changed': self.state = 'READY' self.RestartAgain = True #---LIST_BACKUPS--- elif self.state == 'LIST_BACKUPS': if event == 'list-backups-done': self.state = 'REBUILDING' backup_rebuilder.A('start') elif event == 'restart': self.RestartAgain = True elif event == 'suppliers-changed': self.state = 'READY' self.RestartAgain = True elif event == 'restart': self.state = 'FIRE_HIRE' fire_hire.A('restart') #---REBUILDING--- elif self.state == 'REBUILDING': if (event == 'backup_rebuilder.state' and args[0] in ['DONE', 'STOPPED']): self.state = 'READY' self.doCleanUpBackups(*args, **kwargs) data_sender.A('restart') elif event == 'restart' or event == 'suppliers-changed': self.state = 'FIRE_HIRE' backup_rebuilder.SetStoppedFlag() fire_hire.A('restart') #---FIRE_HIRE--- elif self.state == 'FIRE_HIRE': if event == 'suppliers-changed' and self.isSuppliersNumberChanged( *args, **kwargs): self.state = 'LIST_FILES' self.doDeleteAllBackups(*args, **kwargs) self.doRememberSuppliers(*args, **kwargs) list_files_orator.A('need-files') elif event == 'fire-hire-finished': self.state = 'LIST_FILES' list_files_orator.A('need-files') elif event == 'suppliers-changed' and not self.isSuppliersNumberChanged( *args, **kwargs): self.state = 'LIST_FILES' self.doUpdateSuppliers(*args, **kwargs) self.doRememberSuppliers(*args, **kwargs) list_files_orator.A('need-files') elif event == 'restart': self.RestartAgain = True #---AT_STARTUP--- elif self.state == 'AT_STARTUP': if event == 'init': self.state = 'READY' self.RestartAgain = False return None
def doReportFailed(self, *args, **kwargs): """ Action method. """ from customer import fire_hire fire_hire.A('search-failed', *args, **kwargs)
def doReportDone(self, *args, **kwargs): """ Action method. """ from customer import fire_hire fire_hire.A('supplier-connected', *args, **kwargs)
def A(self, event, arg): from customer import fire_hire #---AT_STARTUP--- if self.state == 'AT_STARTUP': if event == 'start' and not self.isSomeCandidatesListed(arg): self.state = 'RANDOM_USER' self.Attempts = 0 self.doInit(arg) self.doDHTFindRandomUser(arg) elif event == 'start' and self.isSomeCandidatesListed(arg): self.state = 'ACK?' self.doInit(arg) self.doPopCandidate(arg) self.Attempts = 1 self.doSendMyIdentity(arg) #---ACK?--- elif self.state == 'ACK?': if event == 'inbox-packet' and self.isAckFromUser(arg): self.state = 'SERVICE?' self.doSupplierConnect(arg) elif event == 'timer-10sec' and self.Attempts < 5: self.state = 'RANDOM_USER' self.doDHTFindRandomUser(arg) elif self.Attempts == 5 and event == 'timer-10sec': self.state = 'FAILED' self.doDestroyMe(arg) fire_hire.A('search-failed') #---FAILED--- elif self.state == 'FAILED': pass #---DONE--- elif self.state == 'DONE': pass #---RANDOM_USER--- elif self.state == 'RANDOM_USER': if event == 'users-not-found': self.state = 'FAILED' self.doDestroyMe(arg) fire_hire.A('search-failed') elif event == 'found-one-user': self.state = 'ACK?' self.doCleanPrevUser(arg) self.doRememberUser(arg) self.Attempts += 1 self.doSendMyIdentity(arg) #---SERVICE?--- elif self.state == 'SERVICE?': if event == 'supplier-connected': self.state = 'DONE' fire_hire.A('supplier-connected', self.target_idurl) self.doDestroyMe(arg) elif event == 'timer-10sec' and self.Attempts < 5: self.state = 'RANDOM_USER' self.doDHTFindRandomUser(arg) elif self.Attempts == 5 and (event == 'timer-10sec' or event == 'supplier-not-connected'): self.state = 'FAILED' self.doDestroyMe(arg) fire_hire.A('search-failed') elif self.Attempts < 5 and event == 'supplier-not-connected': self.state = 'RANDOM_USER' self.doDHTFindRandomUser(arg) return None