def test_leader_get_migration_is_not_leader(self): self.is_leader.return_value = False l_settings = {'s3': 3} r_settings = {'s1': 1, 's2': 2} def mock_relation_get(attribute=None, unit=None, rid=None): if attribute: if attribute in r_settings: return r_settings.get(attribute) else: return None return copy.deepcopy(r_settings) def mock_leader_get(attribute=None): if attribute: if attribute in l_settings: return l_settings.get(attribute) else: return None return copy.deepcopy(l_settings) def mock_leader_set(settings=None, **kwargs): if settings: l_settings.update(settings) l_settings.update(kwargs) self._relation_get.side_effect = mock_relation_get self._leader_get.side_effect = mock_leader_get self.leader_set.side_effect = mock_leader_set self.assertEqual({'s1': 1, 's2': 2}, peerstorage._relation_get()) self.assertEqual({'s3': 3}, peerstorage._leader_get()) self.assertEqual({'s3': 3}, peerstorage.leader_get()) self.assertEqual({'s3': 3}, l_settings) self.assertFalse(peerstorage.leader_set.called) self.assertEqual({'s3': 3}, peerstorage.leader_get()) self.assertEqual({'s3': 3}, l_settings) self.assertFalse(peerstorage.leader_set.called) # Test that leader vals take precedence over non-leader vals r_settings['s3'] = 2 r_settings['s4'] = 3 l_settings['s4'] = 4 self.assertEqual(4, peerstorage.leader_get('s4')) self.assertEqual({'s3': 3, 's4': 4}, l_settings) self.assertFalse(peerstorage.leader_set.called)
def leader_settings_changed(): if not os.path.exists(rabbit.RABBITMQ_CTL): log('Deferring cookie configuration, RabbitMQ not yet installed') return # Get cookie from leader, update cookie locally and # force cluster-relation-changed hooks to run on peers cookie = leader_get(attribute='cookie') if cookie: update_cookie(leaders_cookie=cookie) # Force cluster-relation-changed hooks to run on peers # This will precipitate peer clustering # Without this a chicken and egg scenario prevails when # using LE and peerstorage for rid in relation_ids('cluster'): relation_set(relation_id=rid, relation_settings={'cookie': cookie})
def leader_settings_changed(): if not os.path.exists(rabbit.RABBITMQ_CTL): log('Deferring cookie configuration, RabbitMQ not yet installed') return # Get cookie from leader, update cookie locally and # force cluster-relation-changed hooks to run on peers cookie = leader_get(attribute='cookie') if cookie: update_cookie(leaders_cookie=cookie) # Force cluster-relation-changed hooks to run on peers # This will precipitate peer clustering # Without this a chicken and egg scenario prevails when # using LE and peerstorage for rid in relation_ids('cluster'): relation_set(relation_id=rid, relation_settings={'cookie': cookie}) # If leader has changed and access credentials, ripple these # out from all units for rid in relation_ids('amqp'): for unit in related_units(rid): amqp_changed(relation_id=rid, remote_unit=unit)
def test_leader_get_migration_is_leader(self): self.is_leader.return_value = True l_settings = {'s3': 3} r_settings = {'s1': 1, 's2': 2} def mock_relation_get(attribute=None, unit=None, rid=None): if attribute: if attribute in r_settings: return r_settings.get(attribute) else: return None return copy.deepcopy(r_settings) def mock_leader_get(attribute=None): if attribute: if attribute in l_settings: return l_settings.get(attribute) else: return None return copy.deepcopy(l_settings) def mock_leader_set(settings=None, **kwargs): if settings: l_settings.update(settings) l_settings.update(kwargs) def check_leader_db(dicta, dictb): _dicta = copy.deepcopy(dicta) _dictb = copy.deepcopy(dictb) miga = json.loads(_dicta[migration_key]).sort() migb = json.loads(_dictb[migration_key]).sort() self.assertEqual(miga, migb) del _dicta[migration_key] del _dictb[migration_key] self.assertEqual(_dicta, _dictb) migration_key = '__leader_get_migrated_settings__' self._relation_get.side_effect = mock_relation_get self._leader_get.side_effect = mock_leader_get self.leader_set.side_effect = mock_leader_set self.assertEqual({'s1': 1, 's2': 2}, peerstorage._relation_get()) self.assertEqual({'s3': 3}, peerstorage._leader_get()) self.assertEqual({'s1': 1, 's2': 2, 's3': 3}, peerstorage.leader_get()) check_leader_db( { 's1': 1, 's2': 2, 's3': 3, migration_key: '["s2", "s1"]' }, l_settings) self.assertTrue(peerstorage.leader_set.called) peerstorage.leader_set.reset_mock() self.assertEqual({'s1': 1, 's2': 2, 's3': 3}, peerstorage.leader_get()) check_leader_db( { 's1': 1, 's2': 2, 's3': 3, migration_key: '["s2", "s1"]' }, l_settings) self.assertFalse(peerstorage.leader_set.called) l_settings = {'s3': 3} peerstorage.leader_set.reset_mock() self.assertEqual(1, peerstorage.leader_get('s1')) check_leader_db({ 's1': 1, 's3': 3, migration_key: '["s1"]' }, l_settings) self.assertTrue(peerstorage.leader_set.called) # Test that leader vals take precedence over non-leader vals r_settings['s3'] = 2 r_settings['s4'] = 3 l_settings['s4'] = 4 peerstorage.leader_set.reset_mock() self.assertEqual(4, peerstorage.leader_get('s4')) check_leader_db( { 's1': 1, 's3': 3, 's4': 4, migration_key: '["s1", "s4"]' }, l_settings) self.assertTrue(peerstorage.leader_set.called) peerstorage.leader_set.reset_mock() self.assertEqual({ 's1': 1, 's2': 2, 's3': 2, 's4': 3 }, peerstorage._relation_get()) check_leader_db( { 's1': 1, 's3': 3, 's4': 4, migration_key: '["s1", "s4"]' }, peerstorage._leader_get()) self.assertEqual({ 's1': 1, 's2': 2, 's3': 3, 's4': 4 }, peerstorage.leader_get()) check_leader_db( { 's1': 1, 's2': 2, 's3': 3, 's4': 4, migration_key: '["s3", "s2", "s1", "s4"]' }, l_settings) self.assertTrue(peerstorage.leader_set.called)