diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index 52195876..7fd89df3 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -7,7 +7,7 @@ jobs: max-parallel: 1 matrix: python_version: ['2.7', '3.4', '3.5', '3.6', '3.7', '3.8', '3.9'] - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repo uses: actions/checkout@v2 diff --git a/.gitignore b/.gitignore index 261e665c..41be9369 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.py[cod] +tests/cases/env my-test-env.sh ## diff --git a/CHANGELOG.md b/CHANGELOG.md index 40f8fc7b..75044425 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ # Changelog +## 7.17.0 +* 对象存储,分片上传默认使用 V2 接口 + ## 7.16.0 * 对象存储,优化并发场景的区域查询 * CDN,查询域名带宽,支持 `data_type` 参数 diff --git a/examples/upload.py b/examples/upload.py index 25aef7cc..62f42348 100755 --- a/examples/upload.py +++ b/examples/upload.py @@ -2,7 +2,7 @@ # flake8: noqa # import hashlib -from qiniu import Auth, put_file, urlsafe_base64_encode +from qiniu import Auth, put_file_v2, urlsafe_base64_encode import qiniu.config from qiniu.compat import is_py2, is_py3 @@ -37,7 +37,7 @@ # 'x-qn-meta-md5': hasher.hexdigest() # } -ret, info = put_file( +ret, info = put_file_v2( token, key, localfile diff --git a/examples/upload_callback.py b/examples/upload_callback.py index 468120a5..80a3df6f 100755 --- a/examples/upload_callback.py +++ b/examples/upload_callback.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # flake8: noqa -from qiniu import Auth, put_file +from qiniu import Auth, put_file_v2 access_key = '...' secret_key = '...' @@ -22,6 +22,6 @@ localfile = './sync/bbb.jpg' -ret, info = put_file(token, key, localfile) +ret, info = put_file_v2(token, key, localfile) print(info) assert ret['key'] == key diff --git a/examples/upload_pfops.py b/examples/upload_pfops.py index d8546c3f..3b89493f 100755 --- a/examples/upload_pfops.py +++ b/examples/upload_pfops.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # flake8: noqa -from qiniu import Auth, put_file, urlsafe_base64_encode +from qiniu import Auth, urlsafe_base64_encode, put_file_v2 access_key = '...' secret_key = '...' @@ -33,6 +33,6 @@ localfile = './python_video.flv' -ret, info = put_file(token, key, localfile) +ret, info = put_file_v2(token, key, localfile) print(info) assert ret['key'] == key diff --git a/examples/upload_with_qvmzone.py b/examples/upload_with_qvmzone.py index 4d298f59..5fd5c531 100644 --- a/examples/upload_with_qvmzone.py +++ b/examples/upload_with_qvmzone.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # flake8: noqa -from qiniu import Auth, put_file, urlsafe_base64_encode +from qiniu import Auth, put_file_v2 import qiniu.config from qiniu import Zone, set_default @@ -34,6 +34,6 @@ scheme='http') set_default(default_zone=zone) -ret, info = put_file(token, key, localfile) +ret, info = put_file_v2(token, key, localfile) print(info) assert ret['key'] == key diff --git a/examples/upload_with_zone.py b/examples/upload_with_zone.py index c8650d39..94a54cec 100644 --- a/examples/upload_with_zone.py +++ b/examples/upload_with_zone.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # flake8: noqa -from qiniu import Auth, put_file +from qiniu import Auth, put_file_v2 from qiniu import Zone, set_default # 需要填写你的 Access Key 和 Secret Key @@ -38,5 +38,5 @@ scheme='https') set_default(default_zone=zone) -ret, info = put_file(token, key, localfile) +ret, info = put_file_v2(token, key, localfile) print(info) diff --git a/qiniu/__init__.py b/qiniu/__init__.py index d097fdb8..85d8ce35 100644 --- a/qiniu/__init__.py +++ b/qiniu/__init__.py @@ -9,7 +9,7 @@ # flake8: noqa -__version__ = '7.16.0' +__version__ = '7.17.0' from .auth import Auth, QiniuMacAuth @@ -19,7 +19,7 @@ from .services.storage.bucket import BucketManager, build_batch_copy, build_batch_rename, build_batch_move, \ build_batch_stat, build_batch_delete, build_batch_restoreAr, build_batch_restore_ar -from .services.storage.uploader import put_data, put_file, put_stream +from .services.storage.uploader import put_data, put_file, put_file_v2, put_stream, put_stream_v2 from .services.storage.upload_progress_recorder import UploadProgressRecorder from .services.cdn.manager import CdnManager, DataType, create_timestamp_anti_leech_url, DomainManager from .services.processing.pfop import PersistentFop diff --git a/qiniu/services/storage/legacy.py b/qiniu/services/storage/legacy.py index db6f0979..e85e580b 100644 --- a/qiniu/services/storage/legacy.py +++ b/qiniu/services/storage/legacy.py @@ -6,11 +6,12 @@ from qiniu import config, http from qiniu.auth import Auth from qiniu.compat import json -from qiniu.utils import _file_iter, crc32, rfc_from_timestamp, urlsafe_base64_encode +from qiniu.utils import _file_iter, crc32, rfc_from_timestamp, urlsafe_base64_encode, deprecated from qiniu.services.storage.upload_progress_recorder import UploadProgressRecorder +@deprecated("use uploader instead") class _Resume(object): """deprecated 断点续上传类 @@ -85,7 +86,7 @@ def recovery_from_record(self): return 0, None, None try: if not record['modify_time'] or record['size'] != self.size or \ - record['modify_time'] != self.modify_time: + record['modify_time'] != self.modify_time: if self.version == 'v1': return 0 elif self.version == 'v2': @@ -106,8 +107,8 @@ def recovery_from_record(self): return record['offset'] elif self.version == 'v2': if not record.__contains__('etags') or len(record['etags']) == 0 or \ - not record.__contains__('expired_at') or float(record['expired_at']) < time.time() or \ - not record.__contains__('upload_id'): + not record.__contains__('expired_at') or float(record['expired_at']) < time.time() or \ + not record.__contains__('upload_id'): return 0, None, None self.blockStatus = record['etags'] return record['offset'], record['upload_id'], record['expired_at'] @@ -178,7 +179,7 @@ def _upload_v2(self): offset, self.uploadId, self.expiredAt = self.recovery_from_record() is_resumed = False if offset > 0 and self.blockStatus != [] and self.uploadId is not None \ - and self.expiredAt is not None: + and self.expiredAt is not None: self.recovery_index = self.blockStatus[-1]['partNumber'] + 1 is_resumed = True else: @@ -201,7 +202,7 @@ def _upload_v2(self): if config.get_default('default_zone').up_host_backup: host = config.get_default('default_zone').up_host_backup else: - host = config.get_default('default_zone')\ + host = config.get_default('default_zone') \ .get_up_host_backup_by_token(self.up_token, self.hostscache_dir) if info.need_retry(): diff --git a/qiniu/services/storage/uploader.py b/qiniu/services/storage/uploader.py index 5bcdf4e5..67c8b189 100644 --- a/qiniu/services/storage/uploader.py +++ b/qiniu/services/storage/uploader.py @@ -4,28 +4,28 @@ from qiniu.config import _BLOCK_SIZE, get_default from qiniu.auth import Auth -from qiniu.utils import crc32, file_crc32, rfc_from_timestamp +from qiniu.utils import crc32, file_crc32, rfc_from_timestamp, deprecated from qiniu.services.storage.uploaders import FormUploader, ResumeUploaderV1, ResumeUploaderV2 from qiniu.services.storage.upload_progress_recorder import UploadProgressRecorder # for compat to old sdk (<= v7.11.1) -from qiniu.services.storage.legacy import _Resume # noqa +from qiniu.services.storage.legacy import _Resume # noqa def put_data( - up_token, - key, - data, - params=None, - mime_type='application/octet-stream', - check_crc=False, - progress_handler=None, - fname=None, - hostscache_dir=None, - metadata=None, - regions=None, - accelerate_uploading=False + up_token, + key, + data, + params=None, + mime_type='application/octet-stream', + check_crc=False, + progress_handler=None, + fname=None, + hostscache_dir=None, + metadata=None, + regions=None, + accelerate_uploading=False ): """上传二进制流到七牛 @@ -60,18 +60,96 @@ def put_data( crc = crc32(final_data) return _form_put( - up_token, key, final_data, params, mime_type, - crc, hostscache_dir, progress_handler, fname, metadata=metadata, + up_token=up_token, key=key, data=final_data, params=params, mime_type=mime_type, + crc=crc, progress_handler=progress_handler, file_name=fname, metadata=metadata, regions=regions, accelerate_uploading=accelerate_uploading ) +@deprecated("use put_file_v2 instead") def put_file( - up_token, key, file_path, params=None, - mime_type='application/octet-stream', check_crc=False, - progress_handler=None, upload_progress_recorder=None, keep_last_modified=False, hostscache_dir=None, - part_size=None, version=None, bucket_name=None, metadata=None, - regions=None, accelerate_uploading=False + up_token, key, file_path, params=None, + mime_type='application/octet-stream', check_crc=False, + progress_handler=None, upload_progress_recorder=None, keep_last_modified=False, hostscache_dir=None, + part_size=None, version='v1', bucket_name=None, metadata=None, + regions=None, accelerate_uploading=False +): + """上传文件到七牛,此接口的分片传接口默认使用 V1,推荐使用 V2,V2 上传效率更高;在一些专有云服务中需要确认服务是否支持 V2。 + + Args: + up_token: 上传凭证 + key: 上传文件名 + file_path: 上传文件的路径 + params: 自定义变量,规格参考 https://developer.qiniu.com/kodo/manual/vars#xvar + mime_type: 上传数据的mimeType + check_crc: 是否校验crc32 + progress_handler: 上传进度 + upload_progress_recorder: 记录上传进度,用于断点续传 + keep_last_modified: 是否保留文件的最后修改时间 + hostscache_dir: host请求 缓存文件保存位置,已废弃 + version: 分片上传版本 目前支持v1/v2版本 默认v1 + part_size: 分片上传v2必传字段 默认大小为4MB 分片大小范围为1 MB - 1 GB + bucket_name: 分片上传v2字段 空间名称 + metadata: 元数据信息 + regions: region信息 + accelerate_uploading: 是否开启加速上传 + + Returns: + 一个dict变量,类似 {"hash": "", "key": ""} + 一个ResponseInfo对象 + """ + return _put_file( + up_token=up_token, key=key, file_path=file_path, params=params, mime_type=mime_type, + check_crc=check_crc, progress_handler=progress_handler, upload_progress_recorder=upload_progress_recorder, + keep_last_modified=keep_last_modified, part_size=part_size, version=version, bucket_name=bucket_name, + metadata=metadata, regions=regions, accelerate_uploading=accelerate_uploading + ) + + +def put_file_v2( + up_token, key, file_path, params=None, + mime_type='application/octet-stream', check_crc=False, + progress_handler=None, upload_progress_recorder=None, keep_last_modified=False, + part_size=None, version='v2', bucket_name=None, metadata=None, + regions=None, accelerate_uploading=False +): + """上传文件到七牛,此接口的分片传接口默认使用 V2,V2 上传效率更高;在一些专有云服务中需要确认服务是否支持 V2。 + + Args: + up_token: 上传凭证 + key: 上传文件名 + file_path: 上传文件的路径 + params: 自定义变量,规格参考 https://developer.qiniu.com/kodo/manual/vars#xvar + mime_type: 上传数据的mimeType + check_crc: 是否校验crc32 + progress_handler: 上传进度 + upload_progress_recorder: 记录上传进度,用于断点续传 + keep_last_modified: 是否保留文件的最后修改时间 + version: 分片上传版本 目前支持v1/v2版本 默认v1 + part_size: 分片上传v2必传字段 默认大小为4MB 分片大小范围为1 MB - 1 GB + bucket_name: 分片上传v2字段 空间名称 + metadata: 元数据信息 + regions: region信息 + accelerate_uploading: 是否开启加速上传 + + Returns: + 一个dict变量,类似 {"hash": "", "key": ""} + 一个ResponseInfo对象 + """ + return _put_file( + up_token=up_token, key=key, file_path=file_path, params=params, mime_type=mime_type, + check_crc=check_crc, progress_handler=progress_handler, upload_progress_recorder=upload_progress_recorder, + keep_last_modified=keep_last_modified, part_size=part_size, version=version, bucket_name=bucket_name, + metadata=metadata, regions=regions, accelerate_uploading=accelerate_uploading + ) + + +def _put_file( + up_token, key, file_path, params=None, + mime_type='application/octet-stream', check_crc=False, + progress_handler=None, upload_progress_recorder=None, keep_last_modified=False, + part_size=None, version=None, bucket_name=None, metadata=None, + regions=None, accelerate_uploading=False ): """上传文件到七牛 @@ -85,7 +163,6 @@ def put_file( progress_handler: 上传进度 upload_progress_recorder: 记录上传进度,用于断点续传 keep_last_modified: 是否保留文件的最后修改时间 - hostscache_dir: host请求 缓存文件保存位置 version: 分片上传版本 目前支持v1/v2版本 默认v1 part_size: 分片上传v2必传字段 默认大小为4MB 分片大小范围为1 MB - 1 GB bucket_name: 分片上传v2字段 空间名称 @@ -103,9 +180,9 @@ def put_file( file_name = os.path.basename(file_path) modify_time = int(os.path.getmtime(file_path)) if size > get_default('default_upload_threshold'): - ret, info = put_stream( - up_token, key, input_stream, file_name, size, hostscache_dir, params, - mime_type, progress_handler, + ret, info = put_stream_v2( + up_token=up_token, key=key, input_stream=input_stream, file_name=file_name, data_size=size, params=params, + mime_type=mime_type, progress_handler=progress_handler, upload_progress_recorder=upload_progress_recorder, modify_time=modify_time, keep_last_modified=keep_last_modified, part_size=part_size, version=version, bucket_name=bucket_name, metadata=metadata, @@ -114,8 +191,8 @@ def put_file( else: crc = file_crc32(file_path) ret, info = _form_put( - up_token, key, input_stream, params, mime_type, - crc, hostscache_dir, progress_handler, file_name, + up_token=up_token, key=key, data=input_stream, params=params, mime_type=mime_type, + crc=crc, progress_handler=progress_handler, file_name=file_name, modify_time=modify_time, keep_last_modified=keep_last_modified, metadata=metadata, regions=regions, accelerate_uploading=accelerate_uploading ) @@ -123,20 +200,19 @@ def put_file( def _form_put( - up_token, - key, - data, - params, - mime_type, - crc, - hostscache_dir=None, - progress_handler=None, - file_name=None, - modify_time=None, - keep_last_modified=False, - metadata=None, - regions=None, - accelerate_uploading=False + up_token, + key, + data, + params, + mime_type, + crc, + progress_handler=None, + file_name=None, + modify_time=None, + keep_last_modified=False, + metadata=None, + regions=None, + accelerate_uploading=False ): bucket_name = Auth.get_bucket_name(up_token) uploader = FormUploader( @@ -153,7 +229,6 @@ def _form_put( return uploader.upload( key=key, data=data, - data_size=None, file_name=file_name, modify_time=modify_time, mime_type=mime_type, @@ -164,25 +239,157 @@ def _form_put( ) +@deprecated("use put_stream_v2 instead") def put_stream( - up_token, - key, - input_stream, - file_name, - data_size, - hostscache_dir=None, - params=None, - mime_type=None, - progress_handler=None, - upload_progress_recorder=None, - modify_time=None, - keep_last_modified=False, - part_size=None, - version='v1', - bucket_name=None, - metadata=None, - regions=None, - accelerate_uploading=False + up_token, + key, + input_stream, + file_name, + data_size, + hostscache_dir=None, + params=None, + mime_type=None, + progress_handler=None, + upload_progress_recorder=None, + modify_time=None, + keep_last_modified=False, + part_size=None, + version='v1', + bucket_name=None, + metadata=None, + regions=None, + accelerate_uploading=False +): + """ 通过 stream 方式上传文件到七牛,此接口的分片传接口默认使用 V1,推荐使用 V2,V2 上传效率更高;在一些专有云服务中需要确认服务是否支持 V2。 + + Args: + up_token: 上传凭证 + key: 上传文件名 + input_stream: 上传数据流 + file_name: 文件名 + data_size: 数据流大小 + hostscache_dir: host请求 缓存文件保存位置,当前已废弃 + params: 自定义变量,规格参考 https://developer.qiniu.com/kodo/manual/vars#xvar + mime_type: 上传数据的mimeType + progress_handler: 上传进度 + upload_progress_recorder: 记录上传进度,用于断点续传 + modify_time: 数据修改时间 + keep_last_modified: 是否保留文件的最后修改时间 + part_size: 分片上传v2必传字段 默认大小为4MB 分片大小范围为1 MB - 1 GB + version: 分片上传版本 目前支持v1/v2版本 默认v1 + bucket_name: 分片上传v2字段 空间名称 + metadata: 元数据信息 + regions: region信息 + accelerate_uploading: 是否开启加速上传 + + Returns: + 一个dict变量,类似 {"hash": "", "key": ""} + 一个ResponseInfo对象 + """ + return _put_stream( + up_token=up_token, + key=key, + input_stream=input_stream, + file_name=file_name, + data_size=data_size, + params=params, + mime_type=mime_type, + progress_handler=progress_handler, + upload_progress_recorder=upload_progress_recorder, + modify_time=modify_time, + keep_last_modified=keep_last_modified, + part_size=part_size, + version=version, + bucket_name=bucket_name, + metadata=metadata, + regions=regions, + accelerate_uploading=accelerate_uploading + ) + + +def put_stream_v2( + up_token, + key, + input_stream, + file_name, + data_size, + params=None, + mime_type=None, + progress_handler=None, + upload_progress_recorder=None, + modify_time=None, + keep_last_modified=False, + part_size=None, + version='v2', + bucket_name=None, + metadata=None, + regions=None, + accelerate_uploading=False +): + """ 通过 stream 方式上传文件到七牛,此接口的分片传接口默认使用 V2,V2 上传效率更高;在一些专有云服务中需要确认服务是否支持 V2。 + + Args: + up_token: 上传凭证 + key: 上传文件名 + input_stream: 上传数据流 + file_name: 文件名 + data_size: 数据流大小 + params: 自定义变量,规格参考 https://developer.qiniu.com/kodo/manual/vars#xvar + mime_type: 上传数据的mimeType + progress_handler: 上传进度 + upload_progress_recorder: 记录上传进度,用于断点续传 + modify_time: 数据修改时间 + keep_last_modified: 是否保留文件的最后修改时间 + part_size: 分片上传v2必传字段 默认大小为4MB 分片大小范围为1 MB - 1 GB + version: 分片上传版本 目前支持v1/v2版本 默认v1 + bucket_name: 分片上传v2字段 空间名称 + metadata: 元数据信息 + regions: region信息 + accelerate_uploading: 是否开启加速上传 + + Returns: + 一个dict变量,类似 {"hash": "", "key": ""} + 一个ResponseInfo对象 + """ + return _put_stream( + up_token=up_token, + key=key, + input_stream=input_stream, + file_name=file_name, + data_size=data_size, + params=params, + mime_type=mime_type, + progress_handler=progress_handler, + upload_progress_recorder=upload_progress_recorder, + modify_time=modify_time, + keep_last_modified=keep_last_modified, + part_size=part_size, + version=version, + bucket_name=bucket_name, + metadata=metadata, + regions=regions, + accelerate_uploading=accelerate_uploading + ) + + +def _put_stream( + up_token, + key, + input_stream, + file_name, + data_size, + params=None, + mime_type=None, + progress_handler=None, + upload_progress_recorder=None, + modify_time=None, + keep_last_modified=False, + part_size=None, + version='v2', + bucket_name=None, + metadata=None, + regions=None, + accelerate_uploading=False ): if not bucket_name: bucket_name = Auth.get_bucket_name(up_token) diff --git a/qiniu/utils.py b/qiniu/utils.py index 197b8813..20f68f21 100644 --- a/qiniu/utils.py +++ b/qiniu/utils.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import warnings +from functools import wraps from hashlib import sha1, new as hashlib_new from base64 import urlsafe_b64encode, urlsafe_b64decode from datetime import datetime, tzinfo, timedelta @@ -264,3 +266,17 @@ def dt2ts(dt): st = (dt - datetime(1970, 1, 1, tzinfo=_UTC_TZINFO())).total_seconds() return int(st) + + +def deprecated(reason): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + warnings.warn( + "DEPRECATED: {} - {}".format(func.__name__, reason), + DeprecationWarning, + stacklevel=2 + ) + return func(*args, **kwargs) + return wrapper + return decorator diff --git a/tests/cases/test_http/conftest.py b/tests/cases/test_http/conftest.py index 9f2c23a8..110018ad 100644 --- a/tests/cases/test_http/conftest.py +++ b/tests/cases/test_http/conftest.py @@ -7,5 +7,5 @@ @pytest.fixture(scope='session') def mock_server_addr(): - addr = os.getenv('MOCK_SERVER_ADDRESS', 'http://localhost:9000') + addr = os.getenv('MOCK_SERVER_ADDRESS', 'http://localhost:8000') yield urlparse(addr) diff --git a/tests/cases/test_services/test_storage/test_bucket_manager.py b/tests/cases/test_services/test_storage/test_bucket_manager.py index 68455652..36282313 100644 --- a/tests/cases/test_services/test_storage/test_bucket_manager.py +++ b/tests/cases/test_services/test_storage/test_bucket_manager.py @@ -69,7 +69,7 @@ def test_mkbucketv3(self, bucket_manager, rand_string): pass def test_list_bucket(self, bucket_manager, bucket_name): - ret, resp = bucket_manager.list_bucket('na0') + ret, resp = bucket_manager.list_bucket('z0') assert resp.ok(), resp assert any(b.get('tbl') == bucket_name for b in ret) diff --git a/tests/cases/test_services/test_storage/test_uploader.py b/tests/cases/test_services/test_storage/test_uploader.py index 158f111d..e8c7cc7d 100644 --- a/tests/cases/test_services/test_storage/test_uploader.py +++ b/tests/cases/test_services/test_storage/test_uploader.py @@ -14,7 +14,7 @@ ) from qiniu.http.endpoint import Endpoint from qiniu.http.region import ServiceName -from qiniu.services.storage.uploader import _form_put +from qiniu.services.storage.uploader import _form_put, put_file_v2, put_stream_v2 from qiniu.services.storage.uploaders.abc import UploaderBase KB = 1024 @@ -154,6 +154,33 @@ def test_put_file( assert ret['key'] == key, info assert actual_md5 == temp_file.md5 + @pytest.mark.parametrize('temp_file', [64 * KB], indirect=True) + def test_put_file_v2( + self, + qn_auth, + bucket_name, + temp_file, + commonly_options, + get_remote_object_headers_and_md5, + get_key + ): + key = get_key('test_file') + + token = qn_auth.upload_token(bucket_name, key) + ret, info = put_file_v2( + token, + key, + temp_file.path, + mime_type=commonly_options.mime_type, + check_crc=True + ) + + _, actual_md5 = get_remote_object_headers_and_md5(key=key) + + assert ret is not None, info + assert ret['key'] == key, info + assert actual_md5 == temp_file.md5 + def test_put_with_invalid_crc(self, qn_auth, bucket_name, get_key): key = get_key('test_invalid') data = 'hello bubby!' @@ -422,6 +449,26 @@ def test_put_stream(self, qn_auth, bucket_name, temp_file, commonly_options, get ) assert ret['key'] == key + @pytest.mark.parametrize('temp_file', [64 * KB], indirect=True) + def test_put_stream_v2(self, qn_auth, bucket_name, temp_file, commonly_options, get_key): + key = get_key('test_file_r') + with open(temp_file.path, 'rb') as input_stream: + token = qn_auth.upload_token(bucket_name, key) + ret, info = put_stream_v2( + token, + key, + input_stream, + temp_file.name, + temp_file.size, + None, + commonly_options.params, + commonly_options.mime_type, + part_size=None, + version=None, + bucket_name=None + ) + assert ret['key'] == key + @pytest.mark.parametrize('temp_file', [64 * KB], indirect=True) def test_put_stream_v2_without_bucket_name(self, qn_auth, bucket_name, temp_file, commonly_options, get_key): key = get_key('test_file_r') diff --git a/tests/mock_server/main.py b/tests/mock_server/main.py index d85129ba..50b750ef 100644 --- a/tests/mock_server/main.py +++ b/tests/mock_server/main.py @@ -47,7 +47,7 @@ def handle_request(self, method): parser.add_argument( '--port', type=int, - default=8000, + default=9000, ) args = parser.parse_args()