Commit c141e54f authored by Jérome Perrin's avatar Jérome Perrin

Merge remote-tracking branch 'upstream/master' into zope4py2

parents 7338b096 c132790b
[python]
part = python2.7
# SlapOS software release to test zodbtools/ZODB4-py2 on Nexedi testing infrastructure.
[buildout]
extends =
test-zodb4.cfg
test-py2.cfg
# SlapOS software release to test zodbtools/ZODB4-wc2-py2 on Nexedi testing infrastructure.
[buildout]
extends =
test-zodb4-wc2.cfg
test-py2.cfg
# SlapOS software release to test zodbtools/ZODB4-wc2 on Nexedi testing infrastructure. # SlapOS software release to test zodbtools/ZODB4-wc2-py3 on Nexedi testing infrastructure.
[buildout] [buildout]
extends = test-common.cfg extends = test-common.cfg
......
# SlapOS software release to test zodbtools/ZODB4-py3 on Nexedi testing infrastructure.
[buildout]
extends = test-common.cfg
[ZODB]
major = 4
# SlapOS software release to test zodbtools/ZODB5-py2 on Nexedi testing infrastructure.
[buildout]
extends =
test-zodb5.cfg
test-py2.cfg
# SlapOS software release to test zodbtools/ZODB5 on Nexedi testing infrastructure. # SlapOS software release to test zodbtools/ZODB5-py3 on Nexedi testing infrastructure.
[buildout] [buildout]
extends = test-common.cfg extends = test-common.cfg
......
# SlapOS software release to test zodbtools on Nexedi testing infrastructure.
[buildout]
extends = test-common.cfg
...@@ -28,7 +28,7 @@ from setuptools import setup, find_packages ...@@ -28,7 +28,7 @@ from setuptools import setup, find_packages
import glob import glob
import os import os
version = '1.0.253' version = '1.0.272'
name = 'slapos.cookbook' name = 'slapos.cookbook'
long_description = open("README.rst").read() long_description = open("README.rst").read()
......
...@@ -36,6 +36,15 @@ class ServerHandler(SimpleHTTPRequestHandler): ...@@ -36,6 +36,15 @@ class ServerHandler(SimpleHTTPRequestHandler):
SimpleHTTPRequestHandler.do_GET(self) SimpleHTTPRequestHandler.do_GET(self)
def do_POST(self): def do_POST(self):
"""Write to a file on the server.
request keys:
path: the path of the file
content: content of the file
clear: (0|1 default 1) overwrite the file if 1
request can be encoded as application/x-www-form-urlencoded or multipart/form-data
"""
logging.info('%s - POST: %s \n%s' % (self.client_address[0], self.path, self.headers)) logging.info('%s - POST: %s \n%s' % (self.client_address[0], self.path, self.headers))
if self.restrictedRootAccess(): if self.restrictedRootAccess():
return return
...@@ -46,14 +55,20 @@ class ServerHandler(SimpleHTTPRequestHandler): ...@@ -46,14 +55,20 @@ class ServerHandler(SimpleHTTPRequestHandler):
environ={'REQUEST_METHOD': 'POST', environ={'REQUEST_METHOD': 'POST',
'CONTENT_TYPE': self.headers['Content-Type']} 'CONTENT_TYPE': self.headers['Content-Type']}
) )
name = form['path'].value.decode('utf-8')
content = form['content'].value file_content = form['content'].value
method = 'ab' file_path = form['path'].value
if 'clear' in form and form['clear'].value == '1': if form['content'].file:
method = 'wb' # post data as multipart/form-data , values are bytes
self.writeFile(name, content, method) file_path = file_path.decode('utf-8')
else:
# application/x-www-form-urlencoded , values are str
file_content = file_content.encode('utf-8')
file_open_mode = 'wb' if ('clear' in form and form['clear'].value in ('1', b'1')) else 'ab'
self.writeFile(file_path, file_content, file_open_mode)
self.respond(200, type=self.headers['Content-Type']) self.respond(200, type=self.headers['Content-Type'])
self.wfile.write(b"Content written to %s" % str2bytes(name)) self.wfile.write(b"Content written to %s" % str2bytes(file_path))
def writeFile(self, filename, content, method='ab'): def writeFile(self, filename, content, method='ab'):
file_path = os.path.abspath(os.path.join(self.document_path, filename)) file_path = os.path.abspath(os.path.join(self.document_path, filename))
......
...@@ -71,22 +71,43 @@ class SimpleHTTPServerTest(unittest.TestCase): ...@@ -71,22 +71,43 @@ class SimpleHTTPServerTest(unittest.TestCase):
'server did not start.\nout: %s error: %s' % self.process.communicate()) 'server did not start.\nout: %s error: %s' % self.process.communicate())
self.assertIn('Directory listing for /', resp.text) self.assertIn('Directory listing for /', resp.text)
# post with multipart/form-data encoding
resp = requests.post( resp = requests.post(
server_base_url, server_base_url,
files={ files={
'path': 'hello.txt', 'path': 'hello-form-data.txt',
'content': b'hello', 'content': 'hello-form-data',
}, },
) )
self.assertEqual(resp.status_code, requests.codes.ok) self.assertEqual(resp.status_code, requests.codes.ok)
self.assertEqual(resp.text, 'Content written to hello-form-data.txt')
with open( with open(
os.path.join(self.base_path, self.recipe.options['path'], os.path.join(self.base_path, self.recipe.options['path'],
'hello.txt')) as f: 'hello-form-data.txt')) as f:
self.assertEqual(f.read(), 'hello') self.assertEqual(f.read(), 'hello-form-data')
self.assertIn('hello.txt', requests.get(server_base_url).text) self.assertIn('hello-form-data.txt', requests.get(server_base_url).text)
self.assertEqual( self.assertEqual(
requests.get(server_base_url + '/hello.txt').text, 'hello') requests.get(server_base_url + '/hello-form-data.txt').text, 'hello-form-data')
# post as application/x-www-form-urlencoded
resp = requests.post(
server_base_url,
data={
'path': 'hello-form-urlencoded.txt',
'content': 'hello-form-urlencoded',
},
)
self.assertEqual(resp.status_code, requests.codes.ok)
with open(
os.path.join(self.base_path, self.recipe.options['path'],
'hello-form-urlencoded.txt')) as f:
self.assertEqual(f.read(), 'hello-form-urlencoded')
self.assertIn('hello-form-urlencoded.txt', requests.get(server_base_url).text)
self.assertEqual(resp.text, 'Content written to hello-form-urlencoded.txt')
self.assertEqual(
requests.get(server_base_url + '/hello-form-urlencoded.txt').text, 'hello-form-urlencoded')
# incorrect paths are refused # incorrect paths are refused
for path in '/hello.txt', '../hello.txt': for path in '/hello.txt', '../hello.txt':
......
...@@ -3,4 +3,4 @@ extends = ...@@ -3,4 +3,4 @@ extends =
software.cfg software.cfg
[python] [python]
part = python3 part = python2.7
...@@ -6,9 +6,6 @@ parts = ...@@ -6,9 +6,6 @@ parts =
slapos-cookbook slapos-cookbook
template template
[python]
part = python2.7
[slapos.buildout-repository] [slapos.buildout-repository]
recipe = slapos.recipe.build:gitclone recipe = slapos.recipe.build:gitclone
repository = https://lab.nexedi.com/nexedi/slapos.buildout.git repository = https://lab.nexedi.com/nexedi/slapos.buildout.git
......
...@@ -181,8 +181,8 @@ def main(): ...@@ -181,8 +181,8 @@ def main():
# Create the site # Create the site
status_dict = waitForSite(args.partition_path) status_dict = waitForSite(args.partition_path)
status_file = tempfile.NamedTemporaryFile() status_file = tempfile.NamedTemporaryFile(mode='w')
status_file.write(json.dumps(status_dict)) json.dump(status_dict, status_file)
status_file.flush() status_file.flush()
os.fsync(status_file.fileno()) os.fsync(status_file.fileno())
os.environ['TEST_SITE_STATUS_JSON'] = status_file.name os.environ['TEST_SITE_STATUS_JSON'] = status_file.name
......
[buildout] [buildout]
extends = extends =
buildout.hash.cfg buildout.hash.cfg
https://lab.nexedi.com/nexedi/slapos/raw/1.0.271/software/kvm/software.cfg https://lab.nexedi.com/nexedi/slapos/raw/1.0.274/software/kvm/software.cfg
parts = parts =
python-with-eggs python-with-eggs
template-deploy-test template-deploy-test
......
...@@ -5,7 +5,7 @@ This software release is used to run unit test of slapos eggs. ...@@ -5,7 +5,7 @@ This software release is used to run unit test of slapos eggs.
The approach is to use nxdtest test runner, which will run tests for each The approach is to use nxdtest test runner, which will run tests for each
projects, as described in `.nxdtest` file. projects, as described in `.nxdtest` file.
The results of this test suite running on Nexedi ERP5 are published as The results of this test suite running on Nexedi ERP5 are published as
`SlapOS.Eggs.UnitTest-Master.Python3` and `SlapOS.Eggs.UnitTest-Master.Python2`. `SlapOS.Eggs.UnitTest-Master.Python3` and `SlapOS.Eggs.UnitTest-Master.Python2`.
...@@ -36,14 +36,14 @@ source ( environment script from step above ) ...@@ -36,14 +36,14 @@ source ( environment script from step above )
cd ~/srv/runner/instance/slappartXXX/parts/slapos.core/ cd ~/srv/runner/instance/slappartXXX/parts/slapos.core/
# make some changes to the code # make some changes to the code
vim slapos/tests/client.py $EDITOR slapos/tests/client.py
# run slapos.core tests # run slapos.core tests
runTestSuite --run slapos.core runTestSuite --run slapos.core
# ... or run all eggs tests # ... or run all eggs tests
runTestSuite runTestSuite
# when satified, commit changes # when satisfied, commit changes
git add -p && git commit git add -p && git commit
# add developer's fork remote (this is only needed the first time) # add developer's fork remote (this is only needed the first time)
......
...@@ -3,4 +3,4 @@ extends = ...@@ -3,4 +3,4 @@ extends =
software.cfg software.cfg
[python] [python]
part = python3 part = python2.7
...@@ -30,9 +30,6 @@ parts = ...@@ -30,9 +30,6 @@ parts =
phantomjs phantomjs
template template
[python]
part = python2.7
[bootstrap-slapos.recipe.cmmi] [bootstrap-slapos.recipe.cmmi]
# install our develop version of slapos.recipe.cmmi before anything else, # install our develop version of slapos.recipe.cmmi before anything else,
# otherwise it will be installed from pypi by dependencies. # otherwise it will be installed from pypi by dependencies.
......
...@@ -193,7 +193,7 @@ setproctitle = 1.1.10 ...@@ -193,7 +193,7 @@ setproctitle = 1.1.10
setuptools-dso = 1.7 setuptools-dso = 1.7
rubygemsrecipe = 0.4.3 rubygemsrecipe = 0.4.3
six = 1.16.0 six = 1.16.0
slapos.cookbook = 1.0.253 slapos.cookbook = 1.0.272
slapos.core = 1.8.1 slapos.core = 1.8.1
slapos.extension.shared = 1.0 slapos.extension.shared = 1.0
slapos.libnetworkcache = 0.25 slapos.libnetworkcache = 0.25
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment