summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2017-08-20 18:21:34 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2017-08-20 18:21:34 -0400
commitcc741e1ac7fce9ce7117b4855d56e38749c04868 (patch)
tree1e82087b420318b963c76df05077daac32c1b239
parent00309662008b8c4a66f3e008d417ff836c91004b (diff)
downloadsqlalchemy-cc741e1ac7fce9ce7117b4855d56e38749c04868.tar.gz
- rework oracle de-provisioning to write URLs to the file as well,
supporting custom dburi etc. Change-Id: Ic0ab0b3b4223e40fd335ee3313fda4dfce942100
-rw-r--r--lib/sqlalchemy/testing/plugin/plugin_base.py5
-rw-r--r--lib/sqlalchemy/testing/plugin/pytestplugin.py4
-rw-r--r--lib/sqlalchemy/testing/provision.py71
-rw-r--r--reap_oracle_dbs.py9
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 506a1c922..cab93a0e7 100644
--- a/lib/sqlalchemy/testing/plugin/plugin_base.py
+++ b/lib/sqlalchemy/testing/plugin/plugin_base.py
@@ -277,6 +277,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 97b981f2a..14aa762e2 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
@@ -279,36 +281,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 = {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])