diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-08-20 18:21:34 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-08-21 12:09:52 -0400 |
commit | 3c48ba620124bb80a89bd0bc8c372da72ba82797 (patch) | |
tree | 2d50156d5e13b7f33980eb0d0981ed34d15673df | |
parent | 57e023b44632bb8f6f90df4c0ff024b0a3cadb45 (diff) | |
download | sqlalchemy-3c48ba620124bb80a89bd0bc8c372da72ba82797.tar.gz |
- rework oracle de-provisioning to write URLs to the file as well,
supporting custom dburi etc.
Change-Id: Ic0ab0b3b4223e40fd335ee3313fda4dfce942100
(cherry picked from commit cc741e1ac7fce9ce7117b4855d56e38749c04868)
-rw-r--r-- | lib/sqlalchemy/testing/plugin/plugin_base.py | 5 | ||||
-rw-r--r-- | lib/sqlalchemy/testing/plugin/pytestplugin.py | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/testing/provision.py | 71 | ||||
-rw-r--r-- | reap_oracle_dbs.py | 9 |
4 files changed, 48 insertions, 41 deletions
diff --git a/lib/sqlalchemy/testing/plugin/plugin_base.py b/lib/sqlalchemy/testing/plugin/plugin_base.py index 996cf4582..915c63421 100644 --- a/lib/sqlalchemy/testing/plugin/plugin_base.py +++ b/lib/sqlalchemy/testing/plugin/plugin_base.py @@ -269,6 +269,11 @@ def _engine_uri(options, file_config): config._current = None for db_url in db_urls: + + if options.write_idents and provision.FOLLOWER_IDENT: # != 'master': + with open(options.write_idents, "a") as file_: + file_.write(provision.FOLLOWER_IDENT + " " + db_url + "\n") + cfg = provision.setup_config( db_url, options, file_config, provision.FOLLOWER_IDENT) diff --git a/lib/sqlalchemy/testing/plugin/pytestplugin.py b/lib/sqlalchemy/testing/plugin/pytestplugin.py index d7da73828..377b4643c 100644 --- a/lib/sqlalchemy/testing/plugin/pytestplugin.py +++ b/lib/sqlalchemy/testing/plugin/pytestplugin.py @@ -42,10 +42,6 @@ def pytest_configure(config): plugin_base.configure_follower( config.slaveinput["follower_ident"] ) - - if config.option.write_idents: - with open(config.option.write_idents, "a") as file_: - file_.write(config.slaveinput["follower_ident"] + "\n") else: if config.option.write_idents and \ os.path.exists(config.option.write_idents): diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py index 3f207138c..ac7a23a43 100644 --- a/lib/sqlalchemy/testing/provision.py +++ b/lib/sqlalchemy/testing/provision.py @@ -1,8 +1,10 @@ from sqlalchemy.engine import url as sa_url +from sqlalchemy import create_engine from sqlalchemy import text from sqlalchemy import exc from sqlalchemy.util import compat from . import config, engines +import collections import os import time import logging @@ -278,36 +280,47 @@ def _oracle_update_db_opts(db_url, db_opts): db_opts['_retry_on_12516'] = True -def reap_oracle_dbs(eng, idents_file): +def reap_oracle_dbs(idents_file): log.info("Reaping Oracle dbs...") - with eng.connect() as conn: - with open(idents_file) as file_: - idents = set(line.strip() for line in file_) - - log.info("identifiers in file: %s", ", ".join(idents)) - - to_reap = conn.execute( - "select u.username from all_users u where username " - "like 'TEST_%' and not exists (select username " - "from v$session where username=u.username)") - all_names = set([username.lower() for (username, ) in to_reap]) - to_drop = set() - for name in all_names: - if name.endswith("_ts1") or name.endswith("_ts2"): - continue - elif name in idents: - to_drop.add(name) - if "%s_ts1" % name in all_names: - to_drop.add("%s_ts1" % name) - if "%s_ts2" % name in all_names: - to_drop.add("%s_ts2" % name) - - dropped = total = 0 - for total, username in enumerate(to_drop, 1): - if _ora_drop_ignore(conn, username): - dropped += 1 - log.info( - "Dropped %d out of %d stale databases detected", dropped, total) + + urls = collections.defaultdict(list) + with open(idents_file) as file_: + for line in file_: + line = line.strip() + db_name, db_url = line.split(" ") + urls[db_url].append(db_name) + + for url in urls: + idents = urls[url] + log.info("db reaper connecting to %r", url) + eng = create_engine(url) + with eng.connect() as conn: + + log.info("identifiers in file: %s", ", ".join(idents)) + + to_reap = conn.execute( + "select u.username from all_users u where username " + "like 'TEST_%' and not exists (select username " + "from v$session where username=u.username)") + all_names = {username.lower() for (username, ) in to_reap} + to_drop = set() + for name in all_names: + if name.endswith("_ts1") or name.endswith("_ts2"): + continue + elif name in idents: + to_drop.add(name) + if "%s_ts1" % name in all_names: + to_drop.add("%s_ts1" % name) + if "%s_ts2" % name in all_names: + to_drop.add("%s_ts2" % name) + + dropped = total = 0 + for total, username in enumerate(to_drop, 1): + if _ora_drop_ignore(conn, username): + dropped += 1 + log.info( + "Dropped %d out of %d stale databases detected", + dropped, total) @_follower_url_from_main.for_db("oracle") diff --git a/reap_oracle_dbs.py b/reap_oracle_dbs.py index 4762faac5..29d227464 100644 --- a/reap_oracle_dbs.py +++ b/reap_oracle_dbs.py @@ -6,8 +6,6 @@ TCP connection even if close() is called, which prevents the provisioning system from dropping a database in-process. """ -from sqlalchemy.testing.plugin import plugin_base -from sqlalchemy.testing import engines from sqlalchemy.testing import provision import logging import sys @@ -15,11 +13,6 @@ import sys logging.basicConfig() logging.getLogger(provision.__name__).setLevel(logging.INFO) -plugin_base.read_config() -oracle = plugin_base.file_config.get('db', 'oracle') -from sqlalchemy.testing import provision - -engine = engines.testing_engine(oracle, {}) -provision.reap_oracle_dbs(engine, sys.argv[1]) +provision.reap_oracle_dbs(sys.argv[1]) |