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.text, 'Content written to hello-form-data.txt')
with open(
os.path.join(self.base_path, self.recipe.options['path'],
'hello-form-data.txt')) as f:
self.assertEqual(f.read(), 'hello-form-data')
self.assertIn('hello-form-data.txt', requests.get(server_base_url).text)
self.assertEqual(
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) self.assertEqual(resp.status_code, requests.codes.ok)
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-urlencoded.txt')) as f:
self.assertEqual(f.read(), 'hello') self.assertEqual(f.read(), 'hello-form-urlencoded')
self.assertIn('hello.txt', requests.get(server_base_url).text) 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( self.assertEqual(
requests.get(server_base_url + '/hello.txt').text, 'hello') 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
......
...@@ -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