Skip to content

Commit 191fec3

Browse files
committed
Improve debugging in integration tests BucketManager
1 parent c159384 commit 191fec3

File tree

4 files changed

+47
-39
lines changed

4 files changed

+47
-39
lines changed

b2sdk/_internal/testing/helpers/base.py

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
from b2sdk._internal.testing.helpers.bucket_manager import BucketManager
1515
from b2sdk.v2 import B2Api
16-
from b2sdk.v2.exception import DuplicateBucketName
1716

1817

1918
@pytest.mark.usefixtures('cls_setup')
@@ -47,30 +46,6 @@ def write_zeros(self, file, number):
4746
written += line_len
4847

4948
def create_bucket(self):
50-
bucket_name = self.bucket_manager.new_bucket_name()
51-
try:
52-
bucket = self.bucket_manager.create_bucket(name=bucket_name)
53-
except DuplicateBucketName:
54-
self._duplicated_bucket_name_debug_info(bucket_name)
55-
raise
49+
bucket = self.bucket_manager.create_bucket()
5650
self.buckets_created.append(bucket)
5751
return bucket
58-
59-
def _duplicated_bucket_name_debug_info(self, bucket_name: str) -> None:
60-
# Trying to obtain as much information as possible about this bucket.
61-
print(' DUPLICATED BUCKET DEBUG START '.center(60, '='))
62-
bucket = self.b2_api.get_bucket_by_name(bucket_name)
63-
64-
print('Bucket metadata:')
65-
bucket_dict = bucket.as_dict()
66-
for info_key, info in bucket_dict.items():
67-
print(f'\t{info_key}: "{info}"')
68-
69-
print('All files (and their versions) inside the bucket:')
70-
ls_generator = bucket.ls(recursive=True, latest_only=False)
71-
for file_version, _directory in ls_generator:
72-
# as_dict() is bound to have more info than we can use,
73-
# but maybe some of it will cast some light on the issue.
74-
print(f'\t{file_version.file_name} ({file_version.as_dict()})')
75-
76-
print(' DUPLICATED BUCKET DEBUG END '.center(60, '='))

b2sdk/_internal/testing/helpers/bucket_manager.py

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from __future__ import annotations
1111

1212
import logging
13+
import os
1314
from collections.abc import Iterable
1415
from datetime import datetime, timedelta
1516
from itertools import chain
@@ -19,7 +20,13 @@
1920

2021
from b2sdk._internal.api import B2Api
2122
from b2sdk._internal.bucket import Bucket
22-
from b2sdk._internal.exception import BadRequest, BucketIdNotFound, FileNotPresent, TooManyRequests
23+
from b2sdk._internal.exception import (
24+
BadRequest,
25+
BucketIdNotFound,
26+
DuplicateBucketName,
27+
FileNotPresent,
28+
TooManyRequests,
29+
)
2330
from b2sdk._internal.file_lock import NO_RETENTION_FILE_SETTING, LegalHold, RetentionMode
2431
from b2sdk._internal.testing.helpers.buckets import (
2532
BUCKET_CREATED_AT_MILLIS,
@@ -48,14 +55,26 @@ def __init__(
4855
self.general_prefix = general_prefix
4956
self.dont_cleanup_old_buckets = dont_cleanup_old_buckets
5057
self.b2_api = b2_api
51-
self.bucket_name_log: list[str] = []
58+
self.bucket_name_mapping: dict[str, str] = {}
5259

5360
def new_bucket_name(self) -> str:
54-
bucket_name = self.current_run_prefix + bucket_name_part(
55-
BUCKET_NAME_LENGTH - len(self.current_run_prefix)
61+
attempts = 5
62+
63+
for _ in range(attempts):
64+
bucket_name = self.current_run_prefix + bucket_name_part(
65+
BUCKET_NAME_LENGTH - len(self.current_run_prefix)
66+
)
67+
if bucket_name not in self.bucket_name_mapping:
68+
return bucket_name
69+
70+
raise RuntimeError(
71+
'Failed to generate a unique bucket name after %d attempts. Last tried name: %s. Existing buckets:\n%s'
72+
% (
73+
attempts,
74+
bucket_name,
75+
self.bucket_name_mapping,
76+
)
5677
)
57-
self.bucket_name_log.append(bucket_name)
58-
return bucket_name
5978

6079
def new_bucket_info(self) -> dict:
6180
return {
@@ -65,12 +84,25 @@ def new_bucket_info(self) -> dict:
6584

6685
def create_bucket(self, bucket_type: str = 'allPublic', **kwargs) -> Bucket:
6786
bucket_name = kwargs.pop('name', self.new_bucket_name())
68-
return self.b2_api.create_bucket(
69-
bucket_name,
70-
bucket_type=bucket_type,
71-
bucket_info=self.new_bucket_info(),
72-
**kwargs,
73-
)
87+
88+
try:
89+
bucket = self.b2_api.create_bucket(
90+
bucket_name,
91+
bucket_type=bucket_type,
92+
bucket_info=self.new_bucket_info(),
93+
**kwargs,
94+
)
95+
except DuplicateBucketName:
96+
logger.error(
97+
'Bucket %s already exists. Currently used buckets:\n%s',
98+
bucket_name,
99+
self.bucket_name_mapping,
100+
)
101+
raise
102+
103+
self.bucket_name_mapping[bucket_name] = os.getenv('PYTEST_CURRENT_TEST', 'unknown test')
104+
105+
return bucket
74106

75107
def _should_remove_bucket(self, bucket: Bucket) -> tuple[bool, str]:
76108
if self.current_run_prefix and bucket.name.startswith(self.current_run_prefix):

b2sdk/_internal/testing/helpers/buckets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def get_seed() -> str:
3939
os.getenv('WORKFLOW_ID', secrets.token_hex(8)),
4040
NODE_DESCRIPTION,
4141
str(time.time_ns()),
42-
os.getenv('PYTEST_XDIST_WORKER', 'gw0'),
42+
os.getenv('PYTEST_XDIST_WORKER', 'master'),
4343
)
4444
)
4545
return sha256(seed.encode()).hexdigest()[:16]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve debugging in integration tests bucket manager.

0 commit comments

Comments
 (0)