Пример #1
0
 def _do_hire_next_broker(self, prev_result, index, hiring_positions,
                          skip_brokers):
     if index >= len(hiring_positions):
         if _Debug:
             lg.args(_DebugLevel,
                     index=index,
                     hiring_positions=hiring_positions,
                     skip_brokers=skip_brokers,
                     prev_result=prev_result,
                     connecting_brokers=self.connecting_brokers)
         return
     broker_pos = hiring_positions[index]
     if _Debug:
         lg.args(_DebugLevel,
                 broker_pos=broker_pos,
                 index=index,
                 hiring_positions=hiring_positions,
                 skip_brokers=skip_brokers,
                 prev_result=prev_result,
                 connecting_brokers=self.connecting_brokers)
     if prev_result and id_url.is_not_in(
             prev_result, skip_brokers, as_field=False, as_bin=True):
         skip_brokers.append(prev_result)
     d = self._do_lookup_one_broker(broker_pos, skip_brokers)
     d.addCallback(self._do_hire_next_broker, index + 1, hiring_positions,
                   skip_brokers)
     if _Debug:
         d.addErrback(lg.errback,
                      debug=_Debug,
                      debug_level=_DebugLevel,
                      method='group_member._do_hire_next_broker')
     d.addErrback(self._do_hire_next_broker, index + 1, hiring_positions,
                  skip_brokers)
Пример #2
0
def unregister_share(A):
    """
    """
    global _ActiveShares
    global _ActiveSharesByIDURL
    _ActiveShares.pop(A.key_id, None)
    if id_url.is_not_in(A.customer_idurl, _ActiveSharesByIDURL):
        lg.warn('given customer idurl not found in active shares list')
    else:
        _ActiveSharesByIDURL[A.customer_idurl] = []
Пример #3
0
 def isSomeCandidatesListed(self, *args, **kwargs):
     """
     Condition method.
     """
     global _SuppliersToHire
     available = []
     for idurl in _SuppliersToHire:
         if id_url.is_not_in(idurl, contactsdb.suppliers(), as_field=False):
             available.append(idurl)
     return len(available) > 0
Пример #4
0
def register_share(A):
    """
    """
    global _ActiveShares
    global _ActiveSharesByIDURL
    if A.key_id in _ActiveShares:
        raise Exception('share already exist')
    if id_url.is_not_in(A.customer_idurl, _ActiveSharesByIDURL):
        _ActiveSharesByIDURL[A.customer_idurl] = []
    _ActiveSharesByIDURL[A.customer_idurl].append(A)
    _ActiveShares[A.key_id] = A
Пример #5
0
 def doPopCandidate(self, *args, **kwargs):
     """
     Action method.
     """
     global _SuppliersToHire
     for idurl in _SuppliersToHire:
         if id_url.is_not_in(idurl, contactsdb.suppliers(), as_field=False):
             self.target_idurl = id_url.field(idurl)
             _SuppliersToHire.remove(idurl)
             break
     lg.info('populate supplier %r from "hire" list, %d more in the list' %
             (self.target_idurl, len(_SuppliersToHire)))
Пример #6
0
def register_group_member(A):
    """
    """
    global _ActiveGroupMembers
    global _ActiveGroupMembersByIDURL
    if _Debug:
        lg.args(_DebugLevel, instance=repr(A))
    if A.group_key_id in _ActiveGroupMembers:
        raise Exception('group_member already exist')
    _ActiveGroupMembers[A.group_key_id] = A
    if id_url.is_not_in(A.group_creator_idurl, _ActiveGroupMembersByIDURL):
        _ActiveGroupMembersByIDURL[A.group_creator_idurl] = []
    _ActiveGroupMembersByIDURL[A.group_creator_idurl].append(A)
Пример #7
0
 def _do_collect_results(all_results):
     if _Debug:
         lg.args(_DebugLevel, all_results=len(all_results))
     final_result = []
     all_brokers = []
     for one_success, one_result in all_results:
         if one_success and one_result['broker_idurl']:
             if id_url.is_not_in(one_result['broker_idurl'],
                                 all_brokers,
                                 as_field=False):
                 all_brokers.append(one_result['broker_idurl'])
                 final_result.append(one_result)
     result.callback(final_result)
     return None
Пример #8
0
 def doRemoveSuppliers(self, *args, **kwargs):
     """
     Action method.
     """
     current_suppliers = contactsdb.suppliers()
     desired_suppliers = settings.getSuppliersNumberDesired()
     if len(current_suppliers) < desired_suppliers:
         lg.warn('must have more suppliers %d<%d' %
                 (len(current_suppliers), desired_suppliers))
     removed_suppliers = []
     for supplier_idurl in self.dismiss_list:
         if id_url.is_not_in(supplier_idurl,
                             current_suppliers,
                             as_field=False):
             lg.warn('%s not a supplier' % supplier_idurl)
             continue
         pos = current_suppliers.index(id_url.field(supplier_idurl))
         current_suppliers[pos] = ''
         removed_suppliers.append((
             pos,
             supplier_idurl,
         ))
         misc.writeSupplierData(
             supplier_idurl,
             'disconnected',
             time.strftime('%d-%m-%Y %H:%M:%S'),
             my_id.getLocalID(),
         )
     current_suppliers = current_suppliers[:desired_suppliers]
     contactsdb.update_suppliers(current_suppliers)
     contactsdb.save_suppliers()
     from main import control
     control.on_suppliers_changed(current_suppliers)
     for position, supplier_idurl in removed_suppliers:
         events.send(
             'supplier-modified',
             dict(
                 new_idurl=None,
                 old_idurl=supplier_idurl,
                 position=position,
             ))
     lg.info(
         'removed some suppliers : %d  desired_suppliers=%d current_suppliers=%d'
         % (len(self.dismiss_list), desired_suppliers,
            len(contactsdb.suppliers())))
     if _Debug:
         lg.out(_DebugLevel,
                '    my current suppliers: %r' % contactsdb.suppliers())
Пример #9
0
def unregister_group_member(A):
    """
    """
    global _ActiveGroupMembers
    global _ActiveGroupMembersByIDURL
    if _Debug:
        lg.args(_DebugLevel, instance=repr(A))
    if id_url.is_not_in(A.group_creator_idurl, _ActiveGroupMembersByIDURL):
        lg.warn(
            'for given customer idurl %r did not found active group members list'
            % A.group_creator_idurl)
    else:
        if A in _ActiveGroupMembersByIDURL[A.group_creator_idurl]:
            _ActiveGroupMembersByIDURL[A.group_creator_idurl].remove(A)
        else:
            lg.warn('group_member() instance not found for customer %r' %
                    A.group_creator_idurl)
    _ActiveGroupMembers.pop(A.group_key_id, None)
Пример #10
0
 def test_in_dict(self):
     self._cache_identity('alice')
     self._cache_identity('bob')
     self._cache_identity('carl')
     d = {}
     d[id_url.field(alice_text)] = 'alice'
     d[id_url.field(bob)] = 'bob'
     self.assertIn(id_url.field(alice_text), d)
     self.assertNotIn(id_url.field(carl), d)
     self.assertTrue(id_url.is_in(alice_text, d))
     self.assertTrue(id_url.is_not_in(carl, d))
     d2 = {
         id_url.field(bob): 'bob',
         'some_key': 'some_value',
     }
     self.assertIn('some_key', d2)
     keys = list(d2.keys())
     with self.assertRaises(TypeError):
         (keys[0] != keys[1])
Пример #11
0
 def verify_broker(self, broker_idurl, position, known_brokers, known_streams):
     if not self.InSync or self.state != 'CONNECTED':
         lg.warn('not able to verify another broker because %r is not in sync' % self)
         return None
     if self.cooperated_brokers:
         if id_url.is_not_in(broker_idurl, self.cooperated_brokers.values()):
             return 'unknown broker'
         if position not in self.cooperated_brokers.keys():
             return 'unknown position'
         if not id_url.is_the_same(self.cooperated_brokers[position], broker_idurl):
             return 'position mismatch'
         if len(self.cooperated_brokers) != len(known_brokers):
             return 'brokers count mismatch'
         for i, b_idurl in self.cooperated_brokers.items():
             if not id_url.is_the_same(known_brokers[i], b_idurl):
                 return 'broker mismatch'
     if self.known_streams and known_streams:
         for my_queue_alias, my_archive_folder_path in self.known_streams.items():
             for other_queue_alias, other_archive_folder_path in self.known_streams.items():
                 # TODO: verify streams
                 pass
     return None
Пример #12
0
 def doHireNewBroker(self, event, *args, **kwargs):
     """
     Action method.
     """
     known_brokers = {}
     known_brokers.update(self.cooperated_brokers or {})
     known_brokers[self.desired_position] = self.my_broker_idurl
     target_pos = self.desired_position - 1
     exclude_brokers = list(
         id_url.to_bin_list(filter(None, self.dht_brokers.values())))
     exclude_brokers.extend(
         list(
             id_url.to_bin_list(
                 filter(None, self.requestor_known_brokers.values()))))
     preferred_brokers = []
     preferred_brokers_raw = config.conf().getData(
         'services/message-broker/preferred-brokers').strip()
     if preferred_brokers_raw:
         preferred_brokers_list = re.split('\n|,|;| ',
                                           preferred_brokers_raw)
         preferred_brokers.extend(preferred_brokers_list)
         preferred_brokers = id_url.to_bin_list(preferred_brokers)
     if preferred_brokers:
         preferred_brokers = [
             x for x in preferred_brokers if x not in exclude_brokers
         ]
     if _Debug:
         lg.args(_DebugLevel,
                 e=event,
                 my=self.my_position,
                 desired=self.desired_position,
                 target=target_pos,
                 exclude=exclude_brokers,
                 preferred=preferred_brokers)
     if preferred_brokers:
         preferred_broker_idurl = id_url.field(preferred_brokers[0])
         if preferred_broker_idurl and id_url.is_not_in(
                 preferred_broker_idurl, exclude_brokers, as_field=False):
             result = p2p_service_seeker.connect_known_node(
                 remote_idurl=preferred_broker_idurl,
                 service_name='service_message_broker',
                 service_params=lambda idurl: self
                 ._do_prepare_service_request_params(
                     idurl, target_pos, known_brokers, event),
                 request_service_timeout=self.broker_negotiate_ack_timeout *
                 (target_pos + 1),
                 exclude_nodes=list(exclude_brokers),
                 force_handshake=True,
                 attempts=1,
             )
             result.addCallback(self._on_new_broker_hired, target_pos,
                                self.my_position, self.desired_position)
             if _Debug:
                 result.addErrback(
                     lg.errback,
                     debug=_Debug,
                     debug_level=_DebugLevel,
                     method='broker_negotiator.doHirePrevBroker')
             result.addErrback(self._on_new_broker_lookup_failed,
                               target_pos)
             return
     result = p2p_service_seeker.connect_random_node(
         lookup_method=lookup.random_message_broker,
         service_name='service_message_broker',
         service_params=lambda
         idurl: self._do_prepare_service_request_params(
             idurl, target_pos, known_brokers, event),
         request_service_timeout=self.broker_negotiate_ack_timeout *
         (target_pos + 1),
         exclude_nodes=list(exclude_brokers),
         attempts=1,
         force_handshake=True,
     )
     result.addCallback(self._on_new_broker_hired, target_pos,
                        self.my_position, self.desired_position)
     if _Debug:
         result.addErrback(lg.errback,
                           debug=_Debug,
                           debug_level=_DebugLevel,
                           method='broker_negotiator.doHirePrevBroker')
     result.addErrback(self._on_new_broker_lookup_failed, target_pos)