Skip to content

Commit c3a6262

Browse files
authored
fix: bKGenericRepoClient not support endpoint_url with url path (#247)
1 parent f3a92b3 commit c3a6262

5 files changed

Lines changed: 22 additions & 19 deletions

File tree

sdks/bk-storages/CHANGE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## Change logs
22

3+
### 2.0.2
4+
5+
- 修复 `BKGenericRepoClient` 不支持 endpoint_url 带子路径的问题
6+
37
### 2.0.1
48

59
- 修复 `BKGenericRepoClient.list_dir` 方法在请求 bkrepo 分页查询时,参数名错误的问题

sdks/bk-storages/bkstorages/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
99
* specific language governing permissions and limitations under the License.
1010
"""
11-
__version__ = "2.0.1"
11+
__version__ = "2.0.2"

sdks/bk-storages/bkstorages/backends/bkrepo.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
from django.utils.timezone import localtime
2525
from requests.adapters import HTTPAdapter
2626
from requests.auth import HTTPBasicAuth
27-
from six.moves.urllib_parse import urljoin
2827

2928
from bkstorages.exceptions import DownloadFailedError, ObjectAlreadyExists, RequestError, UploadFailedError
3029
from bkstorages.utils import clean_name, get_available_overwrite_name, get_setting, safe_join, setting
@@ -92,7 +91,7 @@ def upload_fileobj(self, fh, key: str, allow_overwrite: bool = True, **kwargs):
9291
:param bool allow_overwrite: 是否覆盖已存在文件
9392
"""
9493
client = self.get_client()
95-
url = urljoin(self.endpoint_url, f'/generic/{self.project}/{self.bucket}/{key}')
94+
url = safe_join(self.endpoint_url, f'generic/{self.project}/{self.bucket}/{key}')
9695
src = getattr(fh, "name", "<memory>")
9796
headers = {"X-BKREPO-OVERWRITE": str(allow_overwrite)}
9897

@@ -127,7 +126,7 @@ def download_fileobj(self, key: str, fh, *args, **kwargs):
127126
:param IO fh: 文件句柄
128127
"""
129128
client = self.get_client()
130-
url = urljoin(self.endpoint_url, f'/generic/{self.project}/{self.bucket}/{key}')
129+
url = safe_join(self.endpoint_url, f'generic/{self.project}/{self.bucket}/{key}')
131130
dest = getattr(fh, "name", "<memory>")
132131
try:
133132
resp = client.get(url, stream=True, timeout=TIMEOUT_THRESHOLD)
@@ -156,14 +155,14 @@ def delete_file(self, key: str, *args, **kwargs):
156155
:param str key: 文件完整路径
157156
"""
158157
client = self.get_client()
159-
url = urljoin(self.endpoint_url, f'/generic/{self.project}/{self.bucket}/{key}')
158+
url = safe_join(self.endpoint_url, f'generic/{self.project}/{self.bucket}/{key}')
160159
resp = client.delete(url, timeout=TIMEOUT_THRESHOLD)
161160
self._validate_resp(resp)
162161

163162
def get_file_metadata(self, key: str, *args, **kwargs) -> Dict:
164163
"""具体返回值请看 bk-repo 的文档."""
165164
client = self.get_client()
166-
url = urljoin(self.endpoint_url, f'/generic/{self.project}/{self.bucket}/{key}')
165+
url = safe_join(self.endpoint_url, f'generic/{self.project}/{self.bucket}/{key}')
167166
resp = client.head(url, timeout=TIMEOUT_THRESHOLD)
168167
if resp.status_code == 200:
169168
return dict(resp.headers)
@@ -178,7 +177,7 @@ def build_download_url(self, key: str, force_download: bool = False) -> str:
178177
while key.startswith("/"):
179178
key = key[1:]
180179
download = "true" if force_download else "false"
181-
url = urljoin(self.endpoint_url, f'/generic/{self.project}/{self.bucket}/{key}?download={download}')
180+
url = safe_join(self.endpoint_url, f'generic/{self.project}/{self.bucket}/{key}?download={download}')
182181
return url
183182

184183
def generate_presigned_url(self, key: str, expires_in: int, token_type: str = "DOWNLOAD", *args, **kwargs) -> str:
@@ -189,7 +188,7 @@ def generate_presigned_url(self, key: str, expires_in: int, token_type: str = "D
189188
:param str token_type: token类型。UPLOAD:允许上传, DOWNLOAD: 允许下载, ALL: 同时允许上传和下载。
190189
"""
191190
client = self.get_client()
192-
url = urljoin(self.endpoint_url, '/generic/temporary/url/create')
191+
url = safe_join(self.endpoint_url, 'generic/temporary/url/create')
193192

194193
resp = client.post(
195194
url,
@@ -210,7 +209,7 @@ def generate_presigned_url(self, key: str, expires_in: int, token_type: str = "D
210209
if str(e.code) != '250102':
211210
raise
212211
logger.warning("BKREPO中不存在该文件, 避免报错仅拼接 url ")
213-
return urljoin(self.endpoint_url, f'/generic/temporary/token/download/{self.project}/{self.bucket}/{key}')
212+
return safe_join(self.endpoint_url, f'generic/temporary/token/download/{self.project}/{self.bucket}/{key}')
214213

215214
def list_dir(self, key_prefix: str) -> Tuple[List, List]:
216215
"""
@@ -234,7 +233,7 @@ def __list_dir(self, key_prefix: str, cur_page: int = 1) -> Tuple[List, List, bo
234233
"""
235234
directories, files = [], []
236235
client = self.get_client()
237-
url = urljoin(self.endpoint_url, f"/repository/api/node/page/{self.project}/{self.bucket}/{key_prefix}")
236+
url = safe_join(self.endpoint_url, f"repository/api/node/page/{self.project}/{self.bucket}/{key_prefix}")
238237
# NOTE: 按分页查询 bkrepo 的文件数, 1000 是一个经验值, 设置仅可能大的数值是避免发送太多次请求到 bk-repo
239238
params = {"pageSize": 1000, "pageNumber": cur_page, "includeFolder": True}
240239
resp = client.get(url, params=params, timeout=TIMEOUT_THRESHOLD)
@@ -250,7 +249,7 @@ def __list_dir(self, key_prefix: str, cur_page: int = 1) -> Tuple[List, List, bo
250249
def get_bucket_metadata(self) -> Dict:
251250
"""查询仓库信息"""
252251
client = self.get_client()
253-
url = urljoin(self.endpoint_url, f"/repository/api/repo/info/{self.project}/{self.bucket}/GENERIC")
252+
url = safe_join(self.endpoint_url, f"repository/api/repo/info/{self.project}/{self.bucket}/GENERIC")
254253
resp = client.get(url)
255254
data = self._validate_resp(resp)
256255
return data

sdks/bk-storages/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "bkstorages"
3-
version = "2.0.1"
3+
version = "2.0.2"
44
description = "File storage backends for blueking PaaS platform"
55
readme = "README.md"
66
authors = ["blueking <blueking@tencent.com>"]

sdks/bk-storages/tests/test_bkrepo.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import requests_mock
1818
from django.core.exceptions import SuspiciousFileOperation
1919
from django.core.files.base import File
20-
from six.moves.urllib_parse import urljoin
2120

2221
from bkstorages.backends.bkrepo import BKGenericRepoClient, BKRepoFile, BKRepoStorage, parse_gmt_datetime
22+
from bkstorages.utils import safe_join
2323
from tests.utils import generate_random_string
2424

2525

@@ -67,11 +67,11 @@ def fake_upload(request):
6767
return True
6868

6969
g = adapter.register_uri(
70-
"GET", urljoin(endpoint, f"/generic/dummy-project/dummy-bucket/{key}"), body=io.BytesIO(content)
70+
"GET", safe_join(endpoint, f"generic/dummy-project/dummy-bucket/{key}"), body=io.BytesIO(content)
7171
)
7272
adapter.register_uri(
7373
"PUT",
74-
urljoin(endpoint, f"/generic/dummy-project/dummy-bucket/{key}"),
74+
safe_join(endpoint, f"generic/dummy-project/dummy-bucket/{key}"),
7575
json={"code": 0, "message": ""},
7676
additional_matcher=fake_upload,
7777
)
@@ -131,9 +131,9 @@ def test_list_dir(self, bk_repo_storage, adapter, endpoint, mock_responses, expe
131131
for idx, records in enumerate(mock_responses):
132132
adapter.register_uri(
133133
"GET",
134-
urljoin(
134+
safe_join(
135135
endpoint,
136-
f"/repository/api/node/page/dummy-project/dummy-bucket/"
136+
f"repository/api/node/page/dummy-project/dummy-bucket/"
137137
f"{path}?pageSize=1000&pageNumber={idx + 1}&includeFolder=True",
138138
),
139139
json={"code": 0, "message": 0, "data": {"totalPages": len(mock_responses), "records": records}},
@@ -149,7 +149,7 @@ def test_save_without_name(self, bk_repo_storage, adapter, endpoint):
149149
content = b"aaa"
150150
fh = File(io.BytesIO(content))
151151
adapter.register_uri(
152-
"PUT", urljoin(endpoint, f"/generic/dummy-project/dummy-bucket/{filename}"), json={"code": 0}
152+
"PUT", safe_join(endpoint, f"generic/dummy-project/dummy-bucket/{filename}"), json={"code": 0}
153153
)
154154
assert bk_repo_storage.save(filename, fh)
155155
assert adapter.called
@@ -174,7 +174,7 @@ def test_save_with_name(self, root_path, name, has_error, expected_key, bk_repo_
174174
content = b"import this"
175175
fh = File(io.BytesIO(content), name="foobar.py")
176176
adapter.register_uri(
177-
"PUT", urljoin(endpoint, f"/generic/dummy-project/dummy-bucket/{expected_key}"), json={"code": 0}
177+
"PUT", safe_join(endpoint, f"generic/dummy-project/dummy-bucket/{expected_key}"), json={"code": 0}
178178
)
179179
if has_error:
180180
with pytest.raises(SuspiciousFileOperation):

0 commit comments

Comments
 (0)