Changeset: c629b7f35564 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c629b7f35564
Added Files:
sql/test/remote/Tests/different_user.SQL.py.in
sql/test/remote/Tests/different_user.stable.err
sql/test/remote/Tests/different_user.stable.out
sql/test/remote/Tests/invalid_creds.SQL.py.in
sql/test/remote/Tests/invalid_creds.stable.err
sql/test/remote/Tests/invalid_creds.stable.out
Modified Files:
sql/test/remote/Tests/All
Branch: remote_auth
Log Message:
Add new tests for remote table authorization
One test with invalid credentials and one with a different user
diffs (truncated from 554 to 300 lines):
diff --git a/sql/test/remote/Tests/All b/sql/test/remote/Tests/All
--- a/sql/test/remote/Tests/All
+++ b/sql/test/remote/Tests/All
@@ -1,3 +1,5 @@
HAVE_PYMONETDB?ssbm
HAVE_PYMONETDB&HAVE_DATA_PATH?creds
+HAVE_PYMONETDB&HAVE_DATA_PATH?invalid_creds
+HAVE_PYMONETDB&HAVE_DATA_PATH?different_user
THREADS>=2?partition_elim
diff --git a/sql/test/remote/Tests/different_user.SQL.py.in
b/sql/test/remote/Tests/different_user.SQL.py.in
new file mode 100644
--- /dev/null
+++ b/sql/test/remote/Tests/different_user.SQL.py.in
@@ -0,0 +1,140 @@
+from __future__ import print_function
+
+import os
+import socket
+import sys
+import tempfile
+import threading
+
+import pymonetdb
+
+try:
+ from MonetDBtesting import process
+except ImportError:
+ import process
+
+NWORKERS = 2
+TMPDIR = tempfile.mkdtemp()
+
+MOVIES_TABLE_DEF = ''' (
+ movie_id BIGINT PRIMARY KEY,
+ release_year INT,
+ title VARCHAR(200)
+)
+'''
+
+RATINGS_TABLE_DEF = ''' (
+ movie_id BIGINT,
+ customer_id BIGINT,
+ rating TINYINT,
+ rating_date DATE
+)
+'''
+
+# Complicated FK constraints on merge/remote tables do not work great
+# currently (May 2018)
+RATINGS_TABLE_DEF_FK = ''' (
+ movie_id BIGINT,
+ customer_id BIGINT,
+ rating TINYINT,
+ rating_date DATE
+)
+'''
+
+# Find a free network port
+def freeport():
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.bind(('', 0))
+ port = sock.getsockname()[1]
+ sock.close()
+ return port
+
+# Create the remote tables and load the data. Note: the supervisor
+# database should be already started and should contain the movies
+# table.
+def worker_load(in_filename, workerrec, cmovies, ratings_table_def_fk):
+ c = workerrec['conn']
+ screateq = "CREATE TABLE ratings {}".format(ratings_table_def_fk)
+ load_data = "COPY INTO ratings FROM '{}' USING DELIMITERS
',','\n'".format(in_filename)
+ c.execute(cmovies)
+ c.execute(screateq)
+ c.execute(load_data)
+
+# Setup and start workers
+def create_workers(fn_template, nworkers, cmovies, ratings_table_def_fk):
+ workers = []
+ for i in range(nworkers):
+ workerport = freeport()
+ workerdbname = 'worker_{}'.format(i)
+ workerrec = {
+ 'num': i,
+ 'port': workerport,
+ 'dbname': workerdbname,
+ 'dbfarm': os.path.join(TMPDIR, workerdbname),
+ 'mapi':
'mapi:monetdb://localhost:{}/{}/sys/ratings'.format(workerport, workerdbname),
+ }
+ workerrec['proc'] = process.server(mapiport=workerrec['port'],
dbname=workerrec['dbname'], dbfarm=workerrec['dbfarm'], stdin=process.PIPE,
stdout=process.PIPE)
+ workerrec['conn'] = pymonetdb.connect(database=workerrec['dbname'],
port=workerport, autocommit=True)
+ filename = fn_template.format(workerrec['num'])
+ t = threading.Thread(target=worker_load, args=[filename, workerrec,
cmovies, ratings_table_def_fk])
+ t.start()
+ workerrec['loadthread'] = t
+ workers.append(workerrec)
+
+ for wrec in workers:
+ wrec['loadthread'].join()
+
+ return workers
+
+# Start supervisor database
+supervisorport = freeport()
+supervisorproc = process.server(mapiport=supervisorport, dbname="supervisor",
dbfarm=os.path.join(TMPDIR, "supervisor"), stdin=process.PIPE,
stdout=process.PIPE)
+supervisorconn = pymonetdb.connect(database='supervisor', port=supervisorport,
autocommit=True)
+supervisor_uri =
"mapi:monetdb://localhost:{}/supervisor".format(supervisorport)
+c = supervisorconn.cursor()
+
+# Create user/schema on supervisor
+
+c.execute("CREATE USER \"supervisor_user\" WITH PASSWORD 'supervisor_pass'
NAME 'Supervisor user' schema \"sys\"")
+c.execute("CREATE SCHEMA \"supervisor_schema\" AUTHORIZATION
\"supervisor_user\"")
+c.execute("ALTER USER \"supervisor_user\" SET SCHEMA \"supervisor_schema\"");
+c.execute("SET SCHEMA \"supervisor_schema\"")
+
+# Create the movies table and load the data
+movies_filename="$TSTDATAPATH/netflix_data/movies.csv"
+movies_create = "CREATE TABLE movies {}".format(MOVIES_TABLE_DEF)
+c.execute(movies_create)
+load_movies = "COPY INTO movies FROM '{}' USING DELIMITERS
',','\n','\"'".format(movies_filename)
+c.execute(load_movies)
+
+# Declare the ratings merge table on supervisor
+mtable = "CREATE MERGE TABLE ratings {}".format(RATINGS_TABLE_DEF)
+c.execute(mtable)
+
+# Create the workers and load the ratings data
+fn_template="$TSTDATAPATH/netflix_data/ratings_sample_{}.csv"
+cmovies = "CREATE REMOTE TABLE movies {} ON '{}/supervisor_schema/movies' WITH
USER 'supervisor_user' PASSWORD 'supervisor_pass'".format(MOVIES_TABLE_DEF,
supervisor_uri)
+workers = create_workers(fn_template, NWORKERS, cmovies, RATINGS_TABLE_DEF_FK)
+
+# Create the remote tables on supervisor
+for wrec in workers:
+ rtable = "CREATE REMOTE TABLE ratings{} {} on '{}'".format(wrec['num'],
RATINGS_TABLE_DEF, wrec['mapi'])
+ c.execute(rtable)
+
+ atable = "ALTER TABLE ratings add table ratings{}".format(wrec['num'])
+ c.execute(atable)
+
+# Run the queries
+try:
+ c.execute("SELECT COUNT(*) FROM ratings0")
+ print("{} rows in remote table".format(c.fetchall()[0][0]))
+except pymonetdb.OperationalError as e1:
+ print("OperationalError:", file=sys.stderr)
+ print("# " + e1.message, file=sys.stderr)
+
+try:
+ c.execute("SELECT COUNT(*) FROM ratings")
+ print("{} rows in merge table".format(c.fetchall()[0][0]))
+except pymonetdb.OperationalError as e2:
+ print("OperationalError:", file=sys.stderr)
+ print("# " + e2.message, file=sys.stderr)
diff --git a/sql/test/remote/Tests/different_user.stable.err
b/sql/test/remote/Tests/different_user.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/remote/Tests/different_user.stable.err
@@ -0,0 +1,86 @@
+stderr of test 'different_user` in directory 'sql/test/remote` itself:
+
+
+# 12:34:18 >
+# 12:34:18 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=35657" "--set"
"mapi_usock=/var/tmp/mtest-17442/.s.monetdb.35657" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/kutsurak/work/monet/sources/MonetDB/build/install/var/MonetDB/mTests_sql_test_remote"
"--set" "embedded_c=true"
+# 12:34:18 >
+
+# builtin opt gdk_dbpath =
/home/kutsurak/work/monet/sources/MonetDB/build/install/var/monetdb5/dbfarm/demo
+# builtin opt gdk_debug = 0
+# builtin opt gdk_vmtrim = no
+# builtin opt monet_prompt = >
+# builtin opt monet_daemon = no
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt mapi_port = 35657
+# cmdline opt mapi_usock = /var/tmp/mtest-17442/.s.monetdb.35657
+# cmdline opt monet_prompt =
+# cmdline opt gdk_dbpath =
/home/kutsurak/work/monet/sources/MonetDB/build/install/var/MonetDB/mTests_sql_test_remote
+# cmdline opt embedded_c = true
+# cmdline opt gdk_debug = 553648138
+
+# 12:34:18 >
+# 12:34:18 > "/bin/python" "different_user.SQL.py" "different_user"
+# 12:34:18 >
+
+# builtin opt gdk_dbpath =
/home/kutsurak/work/monet/sources/MonetDB/build/install/var/monetdb5/dbfarm/demo
+# builtin opt gdk_debug = 0
+# builtin opt gdk_vmtrim = no
+# builtin opt monet_prompt = >
+# builtin opt monet_daemon = no
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt monet_prompt =
+# cmdline opt mapi_port = 58809
+# cmdline opt mapi_usock = /var/tmp/mtest-17442/.s.monetdb.58809
+# cmdline opt gdk_dbpath = /tmp/tmp2LPwKk/supervisor/supervisor
+# cmdline opt gdk_debug = 553648138
+# builtin opt gdk_dbpath =
/home/kutsurak/work/monet/sources/MonetDB/build/install/var/monetdb5/dbfarm/demo
+# builtin opt gdk_debug = 0
+# builtin opt gdk_vmtrim = no
+# builtin opt monet_prompt = >
+# builtin opt monet_daemon = no
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt monet_prompt =
+# cmdline opt mapi_port = 60153
+# cmdline opt mapi_usock = /var/tmp/mtest-17442/.s.monetdb.60153
+# cmdline opt gdk_dbpath = /tmp/tmp2LPwKk/worker_0/worker_0
+# cmdline opt gdk_debug = 553648138
+# builtin opt gdk_dbpath =
/home/kutsurak/work/monet/sources/MonetDB/build/install/var/monetdb5/dbfarm/demo
+# builtin opt gdk_debug = 0
+# builtin opt gdk_vmtrim = no
+# builtin opt monet_prompt = >
+# builtin opt monet_daemon = no
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt monet_prompt =
+# cmdline opt mapi_port = 52257
+# cmdline opt mapi_usock = /var/tmp/mtest-17442/.s.monetdb.52257
+# cmdline opt gdk_dbpath = /tmp/tmp2LPwKk/worker_1/worker_1
+# cmdline opt gdk_debug = 553648138
+
+# 12:34:21 >
+# 12:34:21 > "Done."
+# 12:34:21 >
+
diff --git a/sql/test/remote/Tests/different_user.stable.out
b/sql/test/remote/Tests/different_user.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/remote/Tests/different_user.stable.out
@@ -0,0 +1,33 @@
+stdout of test 'different_user` in directory 'sql/test/remote` itself:
+
+
+# 12:34:18 >
+# 12:34:18 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=35657" "--set"
"mapi_usock=/var/tmp/mtest-17442/.s.monetdb.35657" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/kutsurak/work/monet/sources/MonetDB/build/install/var/MonetDB/mTests_sql_test_remote"
"--set" "embedded_c=true"
+# 12:34:18 >
+
+# MonetDB 5 server v11.30.0 (git id: 3b50461604 br: remote_auth)
+# This is an unreleased version
+# Serving database 'mTests_sql_test_remote', using 4 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.513 GiB available main-memory.
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2018 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on
mapi:monetdb://zarquon.zarniwoop.org:35657/
+# Listening for UNIX domain connection requests on
mapi:monetdb:///var/tmp/mtest-17442/.s.monetdb.35657
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+
+# 12:34:18 >
+# 12:34:18 > "/bin/python" "different_user.SQL.py" "different_user"
+# 12:34:18 >
+
+1000 rows in remote table
+2000 rows in merge table
+
+# 12:34:21 >
+# 12:34:21 > "Done."
+# 12:34:21 >
+
diff --git a/sql/test/remote/Tests/invalid_creds.SQL.py.in
b/sql/test/remote/Tests/invalid_creds.SQL.py.in
new file mode 100644
--- /dev/null
+++ b/sql/test/remote/Tests/invalid_creds.SQL.py.in
@@ -0,0 +1,133 @@
+from __future__ import print_function
+
+import os
+import socket
+import sys
+import tempfile
+import threading
+
+import pymonetdb
+
+try:
+ from MonetDBtesting import process
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list