Skip to content

Commit 81cd8cf

Browse files
authored
Add pysftp and paramiko to standard flavor (#115)
1 parent 83c7ef3 commit 81cd8cf

File tree

4 files changed

+161
-0
lines changed

4 files changed

+161
-0
lines changed

tests/lib/docker_db_environment/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ def close(self):
4444
self._client.close()
4545
self.remove_all_started_containers()
4646

47+
def get_client(self):
48+
return self._client
49+
4750
def remove_all_started_containers(self):
4851
for container in self._started_containers:
4952
try:

tests/test/standard-flavor/available-packages.py

+4
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ def test_32(self): self.import_test('boto')
6868
def test_33(self): self.import_test('pycurl')
6969
def test_34(self): self.import_test('requests')
7070
def test_35(self): self.import_test('EXASOL')
71+
def test_36(self): self.import_test('paramiko')
72+
def test_37(self): self.import_test('pysftp')
7173

7274
class AvailablePython3Packages(udf.TestCase):
7375
def setUp(self):
@@ -133,6 +135,8 @@ def test_33(self): self.import_test('pycurl')
133135
def test_34(self): self.import_test('requests')
134136
def test_35(self): self.import_test('pyexasol')
135137
def test_36(self): self.import_test('EXASOL')
138+
def test_36(self): self.import_test('paramiko')
139+
def test_37(self): self.import_test('pysftp')
136140

137141

138142
class AvailableRPackages(udf.TestCase):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#!/usr/bin/env python2.7
2+
3+
import os
4+
import sys
5+
import time
6+
7+
sys.path.append(os.path.realpath(__file__ + '/../../../lib'))
8+
9+
import udf
10+
import docker_db_environment
11+
12+
class ParamikoConnectionTest(udf.TestCase):
13+
14+
@udf.skipIfNot(docker_db_environment.is_available, reason="This test requires a docker-db environment")
15+
def test_connect_via_paramiko_to_ssh_python3(self):
16+
self.connect_via_paramiko_to_ssh("PYTHON3")
17+
18+
19+
@udf.skipIfNot(docker_db_environment.is_available, reason="This test requires a docker-db environment")
20+
def test_connect_via_paramiko_to_ssh_python2(self):
21+
self.connect_via_paramiko_to_ssh("PYTHON")
22+
23+
24+
def connect_via_paramiko_to_ssh(self, python_version):
25+
schema="test_connect_via_paramiko_to_ssh_"+python_version
26+
env=docker_db_environment.DockerDBEnvironment(schema)
27+
try:
28+
self.query(udf.fixindent("DROP SCHEMA %s CASCADE"%schema),ignore_errors=True)
29+
self.query(udf.fixindent("CREATE SCHEMA %s"%schema))
30+
self.query(udf.fixindent("OPEN SCHEMA %s"%schema))
31+
self.query(udf.fixindent('''
32+
CREATE OR REPLACE {python_version} SCALAR SCRIPT connect_container(host varchar(1000), port int,username varchar(1000),password varchar(1000)) returns VARCHAR(100000) AS
33+
import socket
34+
def run(ctx):
35+
import paramiko
36+
try:
37+
ssh = paramiko.SSHClient()
38+
ssh.load_system_host_keys()
39+
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
40+
ssh.connect(hostname=ctx.host,port = ctx.port,username=ctx.username,password=ctx.password)
41+
ssh.close()
42+
return "success"
43+
except paramiko.ssh_exception.NoValidConnectionsError as e:
44+
return "%s,%s,%s,%s,%s"%(str(e.errors),ctx.host,ctx.port,ctx.username,ctx.password)
45+
/
46+
'''.format(python_version=python_version)))
47+
env.get_client().images.pull("panubo/sshd",tag="1.1.0")
48+
container=env.run(name="ssshd",image="panubo/sshd:1.1.0",environment=["SSH_USERS=test_user:1000:1000","SSH_ENABLE_PASSWORD_AUTH=true"])
49+
time.sleep(10)
50+
result=container.exec_run(cmd=''' sh -c "echo 'test_user:test_user' | chpasswd" ''')
51+
time.sleep(5)
52+
print(result)
53+
host=env.get_ip_address_of_container(container)
54+
rows=self.query("select connect_container('%s',%s,'test_user','test_user')"%(host,22))
55+
self.assertRowsEqual([("success",)], rows)
56+
print(container.logs())
57+
finally:
58+
try:
59+
self.query(udf.fixindent("DROP SCHEMA %s CASCADE"%schema))
60+
except:
61+
pass
62+
try:
63+
env.close()
64+
except:
65+
pass
66+
67+
68+
if __name__ == '__main__':
69+
udf.main()
70+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#!/usr/bin/env python2.7
2+
3+
import os
4+
import sys
5+
import time
6+
7+
sys.path.append(os.path.realpath(__file__ + '/../../../lib'))
8+
9+
import udf
10+
import docker_db_environment
11+
12+
class PysftpConnectionTest(udf.TestCase):
13+
14+
@udf.skipIfNot(docker_db_environment.is_available, reason="This test requires a docker-db environment")
15+
def test_pysftp_connect_python3(self):
16+
self.pysftp_connect("PYTHON3")
17+
18+
19+
@udf.skipIfNot(docker_db_environment.is_available, reason="This test requires a docker-db environment")
20+
def test_pysftp_connect_python2(self):
21+
self.pysftp_connect("PYTHON")
22+
23+
24+
def pysftp_connect(self, python_version):
25+
schema="test_pysftp_connect"+python_version
26+
env=docker_db_environment.DockerDBEnvironment(schema)
27+
try:
28+
self.query(udf.fixindent("DROP SCHEMA %s CASCADE"%schema),ignore_errors=True)
29+
self.query(udf.fixindent("CREATE SCHEMA %s"%schema))
30+
self.query(udf.fixindent("OPEN SCHEMA %s"%schema))
31+
self.query(udf.fixindent('''
32+
CREATE OR REPLACE {python_version} SCALAR SCRIPT connect_container(host varchar(1000), port int,username varchar(1000),password varchar(1000), input_string varchar(1000)) returns VARCHAR(100000) AS
33+
import socket
34+
import io
35+
import traceback
36+
import sys
37+
def run(ctx):
38+
import pysftp
39+
cnopts = pysftp.CnOpts()
40+
cnopts.hostkeys = None
41+
try:
42+
with pysftp.Connection(ctx.host, username=ctx.username, password=ctx.password,cnopts=cnopts) as sftp:
43+
with sftp.cd("tmp"):
44+
input_buffer = io.StringIO(ctx.input_string)
45+
sftp.putfo(input_buffer,"test_file")
46+
output_buffer = io.BytesIO()
47+
written=sftp.getfo('test_file',output_buffer)
48+
value=output_buffer.getvalue()
49+
value_decoded=value.decode("utf-8")
50+
return value_decoded
51+
except:
52+
return traceback.format_exc()
53+
54+
/
55+
'''.format(python_version=python_version)))
56+
env.get_client().images.pull("panubo/sshd",tag="1.1.0")
57+
container=env.run(name="sshd_sftp",image="panubo/sshd:1.1.0",environment=["SSH_USERS=test_user:1000:1000","SSH_ENABLE_PASSWORD_AUTH=true","SFTP_MODE=true"],
58+
tmpfs={'/data': 'size=1M,uid=0'})
59+
print(container.logs())
60+
time.sleep(10)
61+
print(container.logs())
62+
result=container.exec_run(cmd=''' sh -c "echo 'test_user:test_user' | chpasswd" ''')
63+
result=container.exec_run(cmd='''mkdir /data/tmp''')
64+
result=container.exec_run(cmd='''chmod 777 /data/tmp''')
65+
time.sleep(5)
66+
print(result)
67+
host=env.get_ip_address_of_container(container)
68+
rows=self.query("select connect_container('%s',%s,'test_user','test_user','success')"%(host,22))
69+
self.assertRowsEqual([("success",)], rows)
70+
print(container.logs())
71+
finally:
72+
try:
73+
self.query(udf.fixindent("DROP SCHEMA %s CASCADE"%schema))
74+
except:
75+
pass
76+
try:
77+
env.close()
78+
except:
79+
pass
80+
81+
82+
if __name__ == '__main__':
83+
udf.main()
84+

0 commit comments

Comments
 (0)