|
9 | 9 | ###################################################################### |
10 | 10 | from __future__ import annotations |
11 | 11 |
|
| 12 | +import logging |
| 13 | +import os |
| 14 | +import platform |
| 15 | +import random |
12 | 16 | import secrets |
| 17 | +import time |
| 18 | +from hashlib import sha256 |
13 | 19 |
|
14 | 20 | from b2sdk._internal.http_constants import BUCKET_NAME_CHARS_UNIQ, BUCKET_NAME_LENGTH_RANGE |
15 | 21 |
|
| 22 | +logger = logging.getLogger(__name__) |
| 23 | + |
16 | 24 | GENERAL_BUCKET_NAME_PREFIX = 'sdktst' |
17 | 25 | BUCKET_NAME_LENGTH = BUCKET_NAME_LENGTH_RANGE[1] |
18 | 26 | BUCKET_CREATED_AT_MILLIS = 'created_at_millis' |
| 27 | +NODE_DESCRIPTION = f'{platform.node()}: {platform.platform()} {platform.python_version()}' |
| 28 | + |
| 29 | + |
| 30 | +def get_seed() -> str: |
| 31 | + """ |
| 32 | + Get seed for random number generator. |
| 33 | +
|
| 34 | + The `WORKFLOW_ID` variable has to be set in the CI to uniquely identify |
| 35 | + the current workflow (including the attempt) |
| 36 | + """ |
| 37 | + seed = ''.join( |
| 38 | + ( |
| 39 | + os.getenv('WORKFLOW_ID', secrets.token_hex(8)), |
| 40 | + NODE_DESCRIPTION, |
| 41 | + str(time.time_ns()), |
| 42 | + os.getenv('PYTEST_XDIST_WORKER', 'gw0'), |
| 43 | + ) |
| 44 | + ) |
| 45 | + return sha256(seed.encode()).hexdigest()[:16] |
19 | 46 |
|
20 | | -RNG = secrets.SystemRandom() |
| 47 | + |
| 48 | +RNG_SEED = get_seed() |
| 49 | +RNG = random.Random(RNG_SEED) |
| 50 | +RNG_COUNTER = 0 |
21 | 51 |
|
22 | 52 |
|
23 | 53 | def random_token(length: int, chars: str = BUCKET_NAME_CHARS_UNIQ) -> str: |
24 | 54 | return ''.join(RNG.choice(chars) for _ in range(length)) |
25 | 55 |
|
26 | 56 |
|
27 | | -def get_bucket_name_prefix(rnd_len: int = 8) -> str: |
28 | | - return GENERAL_BUCKET_NAME_PREFIX + random_token(rnd_len) |
| 57 | +def bucket_name_part(length: int) -> str: |
| 58 | + assert length >= 1 |
| 59 | + global RNG_COUNTER |
| 60 | + RNG_COUNTER += 1 |
| 61 | + name_part = random_token(length, BUCKET_NAME_CHARS_UNIQ) |
| 62 | + logger.info('RNG_SEED: %s', RNG_SEED) |
| 63 | + logger.info('RNG_COUNTER: %i, length: %i', RNG_COUNTER, length) |
| 64 | + logger.info('name_part: %s', name_part) |
| 65 | + logger.info('WORKFLOW_ID: %s', os.getenv('WORKFLOW_ID')) |
| 66 | + return name_part |
| 67 | + |
| 68 | + |
| 69 | +def get_bucket_name_prefix(rnd_len: int = 8, prefix: str = GENERAL_BUCKET_NAME_PREFIX) -> str: |
| 70 | + return prefix + bucket_name_part(rnd_len) |
0 commit comments