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}' }
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}')
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))
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()