Пример #1
0
    def test_get_standby_plproxy_config_misconfigured(self):
        databases = copy.deepcopy(PARTITION_CONFIG_WITH_STANDBYS)
        databases['db1_standby']['PLPROXY'] = {}  # add plproxy config to a standby

        primary_config = PlProxyConfig.from_dict(databases)
        with override_settings(DATABASES=databases), self.assertRaises(PartitionValidationError):
            _get_standby_plproxy_config(primary_config)
Пример #2
0
    def test_get_standby_plproxy_config_missing_standby(self):
        databases = copy.deepcopy(PARTITION_CONFIG_WITH_STANDBYS)
        del databases['db1_standby']  # remove one standby

        primary_config = PlProxyConfig.from_dict(databases)
        with override_settings(DATABASES=databases), self.assertRaises(PartitionValidationError):
            _get_standby_plproxy_config(primary_config)
Пример #3
0
    def test_get_standby_plproxy_config_legacy_format(self):
        config = PlProxyConfig.from_legacy_dict(TEST_LEGACY_FORMAT)
        self.assertEqual('proxy', config.proxy_db)
        self.assertEqual({'db1', 'db2'}, set(config.form_processing_dbs))

        databases = copy.deepcopy(TEST_DATABASES)
        databases.update({
            'db1_standby': {'STANDBY': {'MASTER': 'db1'}},
            'db2_standby': {'STANDBY': {'MASTER': 'db2'}},
        })

        with override_settings(DATABASES=databases):
            _get_standby_plproxy_config(config)
Пример #4
0
def test_load_balanced_plproxy():
    primary_config = PlProxyConfig.from_dict(PARTITION_CONFIG_WITH_STANDBYS)
    standby_config = _get_standby_plproxy_config(primary_config)

    master_standby_mapping = {
        'db1': {'db1_standby'},
        'db2': {'db2_standby'},
    }

    def _test_load_balanced_plproxy(primary_db, ok_standbys, expected_db):
        with patch('corehq.sql_db.util.plproxy_config', primary_config), \
             patch('corehq.sql_db.util.plproxy_standby_config', standby_config), \
             patch('corehq.sql_db.util.get_standbys_with_acceptible_delay', return_value=set(ok_standbys)), \
             patch('corehq.sql_db.util.primary_to_standbys_mapping', return_value=master_standby_mapping):

            db_for_read = select_plproxy_db_for_read(primary_db)
            assert_equal(db_for_read, expected_db)

    plproxy_shard_0 = primary_config.form_processing_dbs[0]
    plproxy_shard_0_standby = standby_config.form_processing_dbs[0]

    test_cases = [
        # (primary_db, standbys_with_acceptible_delay, expected_return_db)
        (primary_config.proxy_db, standby_config.form_processing_dbs, standby_config.proxy_db),
        (primary_config.proxy_db, standby_config.form_processing_dbs[0:1], primary_config.proxy_db),
        (primary_config.proxy_db, [], primary_config.proxy_db),
        (plproxy_shard_0, standby_config.form_processing_dbs, plproxy_shard_0_standby),
        (plproxy_shard_0, standby_config.form_processing_dbs[1:], plproxy_shard_0),
        (plproxy_shard_0, [], plproxy_shard_0),
    ]
    for case in test_cases:
        yield (_test_load_balanced_plproxy,) + case
Пример #5
0
 def test_get_standby_plproxy_config(self):
     primary_config = PlProxyConfig.from_dict(PARTITION_CONFIG_WITH_STANDBYS)
     with override_settings(DATABASES=PARTITION_CONFIG_WITH_STANDBYS):
         standby_config = _get_standby_plproxy_config(primary_config)
     self.assertEqual('commcarehq', standby_config.cluster_name)
     self.assertEqual('proxy_standby', standby_config.proxy_db)
     self.assertEqual({'db1_standby', 'db2_standby'}, set(standby_config.form_processing_dbs))
     self.assertEqual(primary_config.shard_count, standby_config.shard_count)
Пример #6
0
def check_plproxy_config(app_configs, **kwargs):
    allowed_keys = {'PROXY_FOR_STANDBYS', 'PROXY', 'SHARDS', 'PLPROXY_HOST'}
    messages = []
    for db, config in settings.DATABASES.items():
        if 'PLPROXY' in config:
            unknown_keys = set(config['PLPROXY']) - allowed_keys
            if unknown_keys:
                messages.append(checks.Warning(
                    f'Unrecognised PLPROXY settings: {unknown_keys}'
                ))

    try:
        from corehq.sql_db.config import plproxy_config, _get_standby_plproxy_config
        if plproxy_config:
            _get_standby_plproxy_config(plproxy_config)
    except PartitionValidationError as e:
        messages.append(checks.Error(f'Error in PLPROXY standby configuration: {e}'))
    return messages