[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [OSSTEST PATCH 15/16] mg-schema-test-database: Safety catch in JobDB database open



When we open the `osstest' database, see whether this is a parent DB
(main DB) from which a test DB has been spawned by this user.

If it has, bomb out, unless the user has specified a suitable regexp
matching the DB name in the env var
  OSSTEST_DB_USEREAL_IGNORETEST

This means that when a test database is in play, the user who created
it cannot accidentally operate on the real DB.

The safety catch does not affect Tcl programs, which get the DB config
directly, but in general that just means sg-execute-flight and
sg-run-job which already have a fair amount of safety catch because
they demand flight numbers.

mg-schema-test-database hits this feature over the head.  We assume
that the caller of mg-schema-test-database knows what they are doing;
particularly, that if they create nested test DBs (!), they do not
need the assitance of this feature to stop themselves operating
mg-schema-test-database incorrectly.  Anyone who creates nested test
DBs will hopefully recognise the potential for confusion!

Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
 Osstest/JobDB/Executive.pm |   33 ++++++++++++++++++++++++++++++++-
 mg-schema-test-database    |    2 ++
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/Osstest/JobDB/Executive.pm b/Osstest/JobDB/Executive.pm
index 2572f5f..29dbc6f 100644
--- a/Osstest/JobDB/Executive.pm
+++ b/Osstest/JobDB/Executive.pm
@@ -51,8 +51,39 @@ sub current_flight ($) { #method
     return $ENV{'OSSTEST_FLIGHT'};
 }
 
+sub _check_testdbs ($) {
+    my ($dbh) = @_;
+
+    my $re = $ENV{OSSTEST_DB_USEREAL_IGNORETEST} // '';
+    return if $re eq '.*'; # needed by mg-schema-test-database during setup
+
+    # mg-schema-test-database creates a task
+    #   xdbref/DBNAME with username ${Username}@
+    my $sth = $dbh->prepare(<<END);
+        SELECT refkey AS dbname,
+               username, comment
+            FROM tasks
+           WHERE type = 'xdbref'
+             AND live
+             AND username LIKE (? || '@%')
+END
+    $sth->execute($c{Username});
+    my $allok = 1;
+    while (my $row = $sth->fetchrow_hashref()) {
+       next if $row->{dbname} =~ m/^$re$/o;
+       $allok = 0;
+       print STDERR <<END;
+Test DB exists: $row->{dbname} ($row->{username}, "$row->{comment}")
+END
+    }
+    die "Test dbs exist.  Set OSSTEST_DB_USEREAL_IGNORETEST to regexp ?\n"
+       unless $allok;
+}
+
 sub open ($) { #method
-    return opendb('osstestdb');
+    my $dbh = opendb('osstestdb');
+    _check_testdbs($dbh);
+    return $dbh;
 }
 
 sub dbfl_check ($$) { #method
diff --git a/mg-schema-test-database b/mg-schema-test-database
index b41a99b..90a361b 100755
--- a/mg-schema-test-database
+++ b/mg-schema-test-database
@@ -47,6 +47,8 @@ cmd="$1"; shift
 
 localconfig=local-config.test-database
 
+export OSSTEST_DB_USEREAL_IGNORETEST='.*'
+
 maindbname=$(perl -we '
        use Osstest;
        use Osstest::Executive;
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.