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

Reply via email to