File: buckets.py

package info (click to toggle)
python-b2sdk 2.10.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,228 kB
  • sloc: python: 32,094; sh: 13; makefile: 8
file content (70 lines) | stat: -rw-r--r-- 2,054 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
######################################################################
#
# File: b2sdk/_internal/testing/helpers/buckets.py
#
# Copyright 2022 Backblaze Inc. All Rights Reserved.
#
# License https://www.backblaze.com/using_b2_code.html
#
######################################################################
from __future__ import annotations

import logging
import os
import platform
import random
import secrets
import time
from hashlib import sha256

from b2sdk._internal.http_constants import BUCKET_NAME_CHARS_UNIQ, BUCKET_NAME_LENGTH_RANGE

logger = logging.getLogger(__name__)

GENERAL_BUCKET_NAME_PREFIX = 'sdktst'
BUCKET_NAME_LENGTH = BUCKET_NAME_LENGTH_RANGE[1]
BUCKET_CREATED_AT_MILLIS = 'created_at_millis'
NODE_DESCRIPTION = f'{platform.node()}: {platform.platform()} {platform.python_version()}'


def get_seed() -> str:
    """
    Get seed for random number generator.

    The `WORKFLOW_ID` variable has to be set in the CI to uniquely identify
    the current workflow (including the attempt)
    """
    seed = ''.join(
        (
            os.getenv('WORKFLOW_ID', secrets.token_hex(8)),
            NODE_DESCRIPTION,
            str(time.time_ns()),
            os.getenv('PYTEST_XDIST_WORKER', 'master'),
        )
    )
    return sha256(seed.encode()).hexdigest()[:16]


RNG_SEED = get_seed()
RNG = random.Random(RNG_SEED)
RNG_COUNTER = 0


def random_token(length: int, chars: str = BUCKET_NAME_CHARS_UNIQ) -> str:
    return ''.join(RNG.choice(chars) for _ in range(length))


def bucket_name_part(length: int) -> str:
    assert length >= 1
    global RNG_COUNTER
    RNG_COUNTER += 1
    name_part = random_token(length, BUCKET_NAME_CHARS_UNIQ)
    logger.info('RNG_SEED: %s', RNG_SEED)
    logger.info('RNG_COUNTER: %i, length: %i', RNG_COUNTER, length)
    logger.info('name_part: %s', name_part)
    logger.info('WORKFLOW_ID: %s', os.getenv('WORKFLOW_ID'))
    return name_part


def get_bucket_name_prefix(rnd_len: int = 8, prefix: str = GENERAL_BUCKET_NAME_PREFIX) -> str:
    return prefix + bucket_name_part(rnd_len)