def _update_db_proxy(db_name, datastore_name, datastore_ro_name, db_password,
                     datastore_password, datastore_ro_password):
    logs.info('Updating db proxy')
    db_proxy_manager.update(wait_updated=False)
    ok = False
    for i in range(5):
        try:
            for user, password, db in [
                (db_name, db_password, db_name),
                (datastore_name, datastore_password, datastore_name),
                (datastore_ro_name, datastore_ro_password, datastore_name)
            ]:
                if user:
                    db_manager.check_connection_string(
                        db_manager.get_external_connection_string(
                            user, password, db))
            ok = True
            break
        except Exception as e:
            logs.warning(str(e))
        logs.info(f'Waiting for connection to db proxy...')
        # 40 seconds on first iteration - to ensure secret is updated in pgbouncer volume
        time.sleep(40 if i == 0 else 1)
        db_proxy_manager.reload()
        time.sleep(10 if i == 2 else 5)
    assert ok, 'failed to get connection to db proxy'
    yield {
        'step':
        'update-db-proxy',
        'msg':
        f'Updated DB Proxy with the new dbs and roles: {db_name}, {datastore_name}, {datastore_ro_name}'
    }
Example #2
0
def check_envvars(envvars, deis_instance):
    from ckan_cloud_operator.providers.db import manager as db_manager
    from ckan_cloud_operator.deis_ckan.ckan import DeisCkanInstanceCKAN
    logs.info('waiting for instance to be executable...')
    for i in range(20):
        try:
            DeisCkanInstanceCKAN(deis_instance).exec('true')
            break
        except Exception:
            traceback.print_exc()
            logs.warning(f'waiting for instance exec ({i}/20)...')
            time.sleep(5)
            continue
    for url_type, url in {
            'site': envvars.get('CKAN_SITE_URL'),
            'db': envvars.get('CKAN_SQLALCHEMY_URL'),
            'datastore': envvars.get('CKAN__DATASTORE__WRITE_URL'),
            'datastore-ro': envvars.get('CKAN__DATASTORE__READ_URL'),
            'beaker': envvars.get('CKAN___BEAKER__SESSION__URL'),
            'datapusher': envvars.get('CKAN__DATAPUSHER__URL'),
            's3': envvars.get('CKANEXT__S3FILESTORE__HOST_NAME'),
            'solr': envvars.get('CKAN_SOLR_URL'),
    }.items():
        logs.info(f'checking envvar: {url_type}')
        assert url and 'None' not in url, f'invalid url: {url}'
        if url_type in ['site', 'datapusher', 's3']:
            check_cluster_url(url,
                              verify_site_url=url_type == 'site',
                              deis_instance=deis_instance)
        elif url_type in ['db', 'datastore', 'datastore-ro', 'beaker']:
            if '@ckan-cloud-provider-db-proxy-pgbouncer.ckan-cloud:5432' in url:
                db_manager.check_connection_string(
                    url.replace(
                        'ckan-cloud-provider-db-proxy-pgbouncer.ckan-cloud',
                        'localhost'))
        elif url_type == 'solr':
            from ckan_cloud_operator.providers.solr import manager as solr_manager
            assert url.startswith(solr_manager.get_internal_http_endpoint())
        else:
            raise Exception(f'unknown url type: {url_type}')
Example #3
0
def verify_instance_dbs(verify_instance_id):
    from ckan_cloud_operator.providers.db import manager as db_manager
    logs.info(f'{verify_instance_id}: Checking DB..')
    db_manager.check_connection_string(db_manager.get_deis_instsance_external_connection_string(verify_instance_id))
    logs.info(f'{verify_instance_id}: Checking DataStore..')
    db_manager.check_connection_string(db_manager.get_deis_instsance_external_connection_string(verify_instance_id,
                                                                                                is_datastore=True))
    logs.info(f'{verify_instance_id}: Checking DataStore ReadOnly..')
    db_manager.check_connection_string(db_manager.get_deis_instsance_external_connection_string(verify_instance_id,
                                                                                                is_datastore_readonly=True))
Example #4
0
def proxy_update(verify_instance_id, set_pool_mode, reload):
    manager.update(wait_updated=reload, set_pool_mode=set_pool_mode)
    if verify_instance_id:
        from ckan_cloud_operator.providers.db import manager as db_manager
        logs.info(f'{verify_instance_id}: Checking DB..')
        db_manager.check_connection_string(
            db_manager.get_deis_instsance_external_connection_string(
                verify_instance_id))
        logs.info(f'{verify_instance_id}: Checking DataStore..')
        db_manager.check_connection_string(
            db_manager.get_deis_instsance_external_connection_string(
                verify_instance_id, is_datastore=True))
        logs.info(f'{verify_instance_id}: Checking DataStore ReadOnly..')
        db_manager.check_connection_string(
            db_manager.get_deis_instsance_external_connection_string(
                verify_instance_id, is_datastore_readonly=True))
    logs.exit_great_success()