예제 #1
0
    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)
예제 #2
0
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)
예제 #4
0
    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)