Merge "SwiftClient object upload beginning with / or "./""

This commit is contained in:
Jenkins 2015-07-07 22:21:38 +00:00 committed by Gerrit Code Review
commit 92b8277752
3 changed files with 48 additions and 13 deletions

@ -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())