Merge "SwiftClient object upload beginning with / or "./""
This commit is contained in:
commit
92b8277752
@ -1599,6 +1599,10 @@ class SwiftService(object):
|
|||||||
|
|
||||||
def _upload_object_job(self, conn, container, source, obj, options,
|
def _upload_object_job(self, conn, container, source, obj, options,
|
||||||
results_queue=None):
|
results_queue=None):
|
||||||
|
if obj.startswith('./') or obj.startswith('.\\'):
|
||||||
|
obj = obj[2:]
|
||||||
|
if obj.startswith('/'):
|
||||||
|
obj = obj[1:]
|
||||||
res = {
|
res = {
|
||||||
'action': 'upload_object',
|
'action': 'upload_object',
|
||||||
'container': container,
|
'container': container,
|
||||||
@ -1611,10 +1615,6 @@ class SwiftService(object):
|
|||||||
path = source
|
path = source
|
||||||
res['path'] = path
|
res['path'] = path
|
||||||
try:
|
try:
|
||||||
if obj.startswith('./') or obj.startswith('.\\'):
|
|
||||||
obj = obj[2:]
|
|
||||||
if obj.startswith('/'):
|
|
||||||
obj = obj[1:]
|
|
||||||
if path is not None:
|
if path is not None:
|
||||||
put_headers = {'x-object-meta-mtime': "%f" % getmtime(path)}
|
put_headers = {'x-object-meta-mtime': "%f" % getmtime(path)}
|
||||||
else:
|
else:
|
||||||
|
@ -21,12 +21,16 @@ from hashlib import md5
|
|||||||
from mock import Mock, PropertyMock
|
from mock import Mock, PropertyMock
|
||||||
from six.moves.queue import Queue, Empty as QueueEmptyError
|
from six.moves.queue import Queue, Empty as QueueEmptyError
|
||||||
from six import BytesIO
|
from six import BytesIO
|
||||||
|
|
||||||
import swiftclient
|
import swiftclient
|
||||||
import swiftclient.utils as utils
|
import swiftclient.utils as utils
|
||||||
from swiftclient.client import Connection
|
from swiftclient.client import Connection, ClientException
|
||||||
from swiftclient.service import SwiftService, SwiftError
|
from swiftclient.service import SwiftService, SwiftError,\
|
||||||
|
SwiftUploadObject
|
||||||
|
import six
|
||||||
|
if six.PY2:
|
||||||
|
import __builtin__ as builtins
|
||||||
|
else:
|
||||||
|
import builtins
|
||||||
|
|
||||||
clean_os_environ = {}
|
clean_os_environ = {}
|
||||||
environ_prefixes = ('ST_', 'OS_')
|
environ_prefixes = ('ST_', 'OS_')
|
||||||
@ -551,6 +555,39 @@ class TestService(testtools.TestCase):
|
|||||||
self.assertEqual('Segment size should be an integer value',
|
self.assertEqual('Segment size should be an integer value',
|
||||||
exc.value)
|
exc.value)
|
||||||
|
|
||||||
|
@mock.patch('swiftclient.service.stat')
|
||||||
|
@mock.patch('swiftclient.service.getmtime', return_value=1.0)
|
||||||
|
@mock.patch('swiftclient.service.getsize', return_value=4)
|
||||||
|
@mock.patch.object(builtins, 'open', return_value=six.StringIO('asdf'))
|
||||||
|
def test_upload_with_relative_path(self, *args, **kwargs):
|
||||||
|
service = SwiftService({})
|
||||||
|
objects = [{'path': "./test",
|
||||||
|
'strt_indx': 2},
|
||||||
|
{'path': os.path.join(os.getcwd(), "test"),
|
||||||
|
'strt_indx': 1},
|
||||||
|
{'path': ".\\test",
|
||||||
|
'strt_indx': 2}]
|
||||||
|
for obj in objects:
|
||||||
|
with mock.patch('swiftclient.service.Connection') as mock_conn:
|
||||||
|
mock_conn.return_value.head_object.side_effect = \
|
||||||
|
ClientException('Not Found', http_status=404)
|
||||||
|
mock_conn.return_value.put_object.return_value =\
|
||||||
|
'd41d8cd98f00b204e9800998ecf8427e'
|
||||||
|
resp_iter = service.upload(
|
||||||
|
'c', [SwiftUploadObject(obj['path'])])
|
||||||
|
responses = [x for x in resp_iter]
|
||||||
|
for resp in responses:
|
||||||
|
self.assertTrue(resp['success'])
|
||||||
|
self.assertEqual(2, len(responses))
|
||||||
|
create_container_resp, upload_obj_resp = responses
|
||||||
|
self.assertEqual(create_container_resp['action'],
|
||||||
|
'create_container')
|
||||||
|
self.assertEqual(upload_obj_resp['action'],
|
||||||
|
'upload_object')
|
||||||
|
self.assertEqual(upload_obj_resp['object'],
|
||||||
|
obj['path'][obj['strt_indx']:])
|
||||||
|
self.assertEqual(upload_obj_resp['path'], obj['path'])
|
||||||
|
|
||||||
|
|
||||||
class TestServiceUpload(testtools.TestCase):
|
class TestServiceUpload(testtools.TestCase):
|
||||||
|
|
||||||
|
@ -1635,7 +1635,7 @@ class TestCrossAccountObjectAccess(TestBase, MockHttpTest):
|
|||||||
|
|
||||||
self.assertRequests([('PUT', self.cont_path),
|
self.assertRequests([('PUT', self.cont_path),
|
||||||
('PUT', self.obj_path)])
|
('PUT', self.obj_path)])
|
||||||
self.assertEqual(self.obj, out.strip())
|
self.assertEqual(self.obj[1:], out.strip())
|
||||||
expected_err = 'Warning: failed to create container %r: 403 Fake' \
|
expected_err = 'Warning: failed to create container %r: 403 Fake' \
|
||||||
% self.cont
|
% self.cont
|
||||||
self.assertEqual(expected_err, out.err.strip())
|
self.assertEqual(expected_err, out.err.strip())
|
||||||
@ -1644,7 +1644,6 @@ class TestCrossAccountObjectAccess(TestBase, MockHttpTest):
|
|||||||
req_handler = self._fake_cross_account_auth(False, True)
|
req_handler = self._fake_cross_account_auth(False, True)
|
||||||
fake_conn = self.fake_http_connection(403, 403,
|
fake_conn = self.fake_http_connection(403, 403,
|
||||||
on_request=req_handler)
|
on_request=req_handler)
|
||||||
|
|
||||||
args, env = self._make_cmd('upload', cmd_args=[self.cont, self.obj,
|
args, env = self._make_cmd('upload', cmd_args=[self.cont, self.obj,
|
||||||
'--leave-segments'])
|
'--leave-segments'])
|
||||||
with mock.patch('swiftclient.client._import_keystone_client',
|
with mock.patch('swiftclient.client._import_keystone_client',
|
||||||
@ -1656,10 +1655,9 @@ class TestCrossAccountObjectAccess(TestBase, MockHttpTest):
|
|||||||
swiftclient.shell.main(args)
|
swiftclient.shell.main(args)
|
||||||
except SystemExit as e:
|
except SystemExit as e:
|
||||||
self.fail('Unexpected SystemExit: %s' % e)
|
self.fail('Unexpected SystemExit: %s' % e)
|
||||||
|
|
||||||
self.assertRequests([('PUT', self.cont_path),
|
self.assertRequests([('PUT', self.cont_path),
|
||||||
('PUT', self.obj_path)])
|
('PUT', self.obj_path)])
|
||||||
self.assertEqual(self.obj, out.strip())
|
self.assertEqual(self.obj[1:], out.strip())
|
||||||
expected_err = 'Warning: failed to create container %r: 403 Fake' \
|
expected_err = 'Warning: failed to create container %r: 403 Fake' \
|
||||||
% self.cont
|
% self.cont
|
||||||
self.assertEqual(expected_err, out.err.strip())
|
self.assertEqual(expected_err, out.err.strip())
|
||||||
@ -1694,7 +1692,7 @@ class TestCrossAccountObjectAccess(TestBase, MockHttpTest):
|
|||||||
self.assert_request(('PUT', segment_path_0))
|
self.assert_request(('PUT', segment_path_0))
|
||||||
self.assert_request(('PUT', segment_path_1))
|
self.assert_request(('PUT', segment_path_1))
|
||||||
self.assert_request(('PUT', self.obj_path))
|
self.assert_request(('PUT', self.obj_path))
|
||||||
self.assertTrue(self.obj in out.out)
|
self.assertTrue(self.obj[1:] in out.out)
|
||||||
expected_err = 'Warning: failed to create container %r: 403 Fake' \
|
expected_err = 'Warning: failed to create container %r: 403 Fake' \
|
||||||
% self.cont
|
% self.cont
|
||||||
self.assertEqual(expected_err, out.err.strip())
|
self.assertEqual(expected_err, out.err.strip())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user