Exemplo n.º 1
0
 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
Exemplo n.º 2
0
 def doRestartFireHire(self, *args, **kwargs):
     """
     Action method.
     """
     if driver.is_on('service_employer'):
         from customer import fire_hire
         fire_hire.A('restart')
Exemplo n.º 3
0
 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,
     )
Exemplo n.º 4
0
 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')
Exemplo n.º 5
0
 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)
Exemplo n.º 6
0
 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')
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
 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
Exemplo n.º 9
0
 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
Exemplo n.º 10
0
 def _on_needed_space_modified(self, path, value, oldvalue, result):
     from customer import fire_hire
     fire_hire.ClearLastFireTime()
     fire_hire.A('restart')
Exemplo n.º 11
0
 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')
Exemplo n.º 12
0
 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
Exemplo n.º 13
0
 def doReportFailed(self, *args, **kwargs):
     """
     Action method.
     """
     from customer import fire_hire
     fire_hire.A('search-failed', *args, **kwargs)
Exemplo n.º 14
0
 def doReportDone(self, *args, **kwargs):
     """
     Action method.
     """
     from customer import fire_hire
     fire_hire.A('supplier-connected', *args, **kwargs)
Exemplo n.º 15
0
    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