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,
results_queue=None):
if obj.startswith('./') or obj.startswith('.\\'):
obj = obj[2:]
if obj.startswith('/'):
obj = obj[1:]
res = {
'action': 'upload_object',
'container': container,
@ -1611,10 +1615,6 @@ class SwiftService(object):
path = source
res['path'] = path
try:
if obj.startswith('./') or obj.startswith('.\\'):
obj = obj[2:]
if obj.startswith('/'):
obj = obj[1:]
if path is not None:
put_headers = {'x-object-meta-mtime': "%f" % getmtime(path)}
else:

@ -21,12 +21,16 @@ from hashlib import md5
from mock import Mock, PropertyMock
from six.moves.queue import Queue, Empty as QueueEmptyError
from six import BytesIO
import swiftclient
import swiftclient.utils as utils
from swiftclient.client import Connection
from swiftclient.service import SwiftService, SwiftError
from swiftclient.client import Connection, ClientException
from swiftclient.service import SwiftService, SwiftError,\
SwiftUploadObject
import six
if six.PY2:
import __builtin__ as builtins
else:
import builtins
clean_os_environ = {}
environ_prefixes = ('ST_', 'OS_')
@ -551,6 +555,39 @@ class TestService(testtools.TestCase):
self.assertEqual('Segment size should be an integer 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):

@ -1635,7 +1635,7 @@ class TestCrossAccountObjectAccess(TestBase, MockHttpTest):
self.assertRequests([('PUT', self.cont_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' \
% self.cont
self.assertEqual(expected_err, out.err.strip())
@ -1644,7 +1644,6 @@ class TestCrossAccountObjectAccess(TestBase, MockHttpTest):
req_handler = self._fake_cross_account_auth(False, True)
fake_conn = self.fake_http_connection(403, 403,
on_request=req_handler)
args, env = self._make_cmd('upload', cmd_args=[self.cont, self.obj,
'--leave-segments'])
with mock.patch('swiftclient.client._import_keystone_client',
@ -1656,10 +1655,9 @@ class TestCrossAccountObjectAccess(TestBase, MockHttpTest):
swiftclient.shell.main(args)
except SystemExit as e:
self.fail('Unexpected SystemExit: %s' % e)
self.assertRequests([('PUT', self.cont_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' \
% self.cont
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_1))
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' \
% self.cont
self.assertEqual(expected_err, out.err.strip())