huaweicloud-encryption-sdk-python 1.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- examples/file_encryption_example.py +57 -0
- examples/key_capsule_encryption_example.py +240 -0
- examples/kms_discovery_encryption_example.py +56 -0
- examples/local_aes_encryption_example.py +59 -0
- examples/test_rsa.py +42 -0
- examples/test_sm2.py +38 -0
- examples/test_sm4_cbc.py +37 -0
- examples/test_sm4_gcm.py +37 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/METADATA +18 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/RECORD +174 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/WHEEL +5 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/top_level.txt +3 -0
- huaweicloud_encryptionsdk/__init__.py +5 -0
- huaweicloud_encryptionsdk/_apig_sdk/__init__.py +1 -0
- huaweicloud_encryptionsdk/_apig_sdk/signer.py +278 -0
- huaweicloud_encryptionsdk/_apig_sdk/signer_v11.py +70 -0
- huaweicloud_encryptionsdk/_apig_sdk/sm3_hash.py +141 -0
- huaweicloud_encryptionsdk/_lts_sdk/auth/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/auth/signer.py +174 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/consumer_client_adapter.py +59 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/http_client.py +211 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/client_consumer_worker.py +106 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/consumer_heartbeat.py +73 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/log_shard_consumer.py +179 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_check_point_tracker.py +120 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor_factory.py +3 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/check_point.py +20 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/consumer_config.py +27 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/log_data.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/task_result.py +40 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/consumer_fetch_task.py +53 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/initial_task.py +55 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/process_task.py +25 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/shutdown_task.py +24 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer_main.py +88 -0
- huaweicloud_encryptionsdk/_lts_sdk/parallel_main.py +64 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/callback/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/callback/call_back.py +7 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/accumulator.py +135 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_thread_pool.py +107 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_worker.py +124 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/mover.py +69 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/producer.py +98 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/http_client.py +63 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/simple_request.py +14 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/config.py +50 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/error.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/log.py +87 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/log_batch.py +154 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/lts_store.py +21 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/result.py +17 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/retry_queue.py +39 -0
- huaweicloud_encryptionsdk/_lts_sdk/serial_main.py +77 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/common.py +57 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/lts_threading.py +32 -0
- huaweicloud_encryptionsdk/cache/__init__.py +0 -0
- huaweicloud_encryptionsdk/cache/data_key_cache.py +79 -0
- huaweicloud_encryptionsdk/cache/local_data_key_cache.py +161 -0
- huaweicloud_encryptionsdk/common/__init__.py +0 -0
- huaweicloud_encryptionsdk/common/constants.py +15 -0
- huaweicloud_encryptionsdk/common/counting_output_stream.py +18 -0
- huaweicloud_encryptionsdk/common/crypto_factory.py +48 -0
- huaweicloud_encryptionsdk/common/ec_private_key_loader.py +43 -0
- huaweicloud_encryptionsdk/common/ecs_metadata_service.py +42 -0
- huaweicloud_encryptionsdk/common/file_path_for_example_constants.py +4 -0
- huaweicloud_encryptionsdk/common/utils.py +162 -0
- huaweicloud_encryptionsdk/exception/__init__.py +0 -0
- huaweicloud_encryptionsdk/exception/errors.py +109 -0
- huaweicloud_encryptionsdk/handler/__init__.py +0 -0
- huaweicloud_encryptionsdk/handler/cipher_handler.py +294 -0
- huaweicloud_encryptionsdk/handler/crypto_handler.py +24 -0
- huaweicloud_encryptionsdk/handler/default_crypto_handler.py +148 -0
- huaweicloud_encryptionsdk/handler/default_serialize_handler.py +45 -0
- huaweicloud_encryptionsdk/handler/file_decrypt_handler.py +101 -0
- huaweicloud_encryptionsdk/handler/file_encrypt_handler.py +30 -0
- huaweicloud_encryptionsdk/handler/serialize_handler.py +14 -0
- huaweicloud_encryptionsdk/huawei_config.py +49 -0
- huaweicloud_encryptionsdk/huawei_crypto.py +311 -0
- huaweicloud_encryptionsdk/keyrings/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/keyring.py +14 -0
- huaweicloud_encryptionsdk/keyrings/keyring_factory.py +10 -0
- huaweicloud_encryptionsdk/keyrings/kms_keyring_factory.py +21 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_discovery_keyring.py +51 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_key_capsule_keyring.py +100 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_keyring.py +155 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_multi_region_keyring.py +8 -0
- huaweicloud_encryptionsdk/keyrings/raw_keyring_factory.py +27 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_aes_keyring.py +63 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_keyring.py +112 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_rsa_keyring.py +55 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm2_keyring.py +75 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_cbc_keyring.py +66 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_keyring.py +70 -0
- huaweicloud_encryptionsdk/kms/__init__.py +0 -0
- huaweicloud_encryptionsdk/kms/create_key_capsule_request.py +35 -0
- huaweicloud_encryptionsdk/kms/create_key_capsule_response.py +19 -0
- huaweicloud_encryptionsdk/kms/decrypt_key_capsule_request.py +32 -0
- huaweicloud_encryptionsdk/kms/decrypt_key_capsule_response.py +19 -0
- huaweicloud_encryptionsdk/kms/kms_http_client.py +116 -0
- huaweicloud_encryptionsdk/log/__init__.py +0 -0
- huaweicloud_encryptionsdk/log/log_config.py +30 -0
- huaweicloud_encryptionsdk/log/log_file_backup.py +144 -0
- huaweicloud_encryptionsdk/log/log_metrics.py +132 -0
- huaweicloud_encryptionsdk/log/log_reporter_manager.py +163 -0
- huaweicloud_encryptionsdk/log/lts_sdk_producer.py +386 -0
- huaweicloud_encryptionsdk/log/lts_struct_log_builder.py +106 -0
- huaweicloud_encryptionsdk/meterialmanager/__init__.py +0 -0
- huaweicloud_encryptionsdk/meterialmanager/cache_crypto_meterial_manager.py +221 -0
- huaweicloud_encryptionsdk/meterialmanager/crypto_meterial_manager.py +19 -0
- huaweicloud_encryptionsdk/meterialmanager/data_key_generate.py +10 -0
- huaweicloud_encryptionsdk/meterialmanager/data_key_generate_factory.py +20 -0
- huaweicloud_encryptionsdk/meterialmanager/default_crypto_meterials_manager.py +71 -0
- huaweicloud_encryptionsdk/meterialmanager/key_capsule_data_key_generate.py +63 -0
- huaweicloud_encryptionsdk/meterialmanager/kms_data_key_generate.py +65 -0
- huaweicloud_encryptionsdk/meterialmanager/local_data_key_generate.py +13 -0
- huaweicloud_encryptionsdk/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/access_point_config.py +9 -0
- huaweicloud_encryptionsdk/model/cipher_body.py +81 -0
- huaweicloud_encryptionsdk/model/cipher_header.py +405 -0
- huaweicloud_encryptionsdk/model/ciphertext_data_key.py +166 -0
- huaweicloud_encryptionsdk/model/crypto_result.py +11 -0
- huaweicloud_encryptionsdk/model/data_key_materials.py +17 -0
- huaweicloud_encryptionsdk/model/data_materials.py +11 -0
- huaweicloud_encryptionsdk/model/enums/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/enums/access_point_type.py +28 -0
- huaweicloud_encryptionsdk/model/enums/crypto_algorithm.py +75 -0
- huaweicloud_encryptionsdk/model/enums/data_key_generate_type.py +20 -0
- huaweicloud_encryptionsdk/model/enums/key_provider_enum.py +19 -0
- huaweicloud_encryptionsdk/model/enums/keyring_type_enum.py +27 -0
- huaweicloud_encryptionsdk/model/key_capsule.py +10 -0
- huaweicloud_encryptionsdk/model/key_capsule_config.py +12 -0
- huaweicloud_encryptionsdk/model/kms_config.py +10 -0
- huaweicloud_encryptionsdk/model/request/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/request/encrypt_request.py +10 -0
- huaweicloud_encryptionsdk/model/request/sign_request.py +2 -0
- huaweicloud_encryptionsdk/model/request/verify_request.py +2 -0
- huaweicloud_encryptionsdk/proof/__init__.py +0 -0
- huaweicloud_encryptionsdk/proof/attestation_document.py +36 -0
- huaweicloud_encryptionsdk/proof/collector/__init__.py +0 -0
- huaweicloud_encryptionsdk/proof/collector/cce_proof_collector.py +24 -0
- huaweicloud_encryptionsdk/proof/collector/ecs_proof_collector.py +11 -0
- huaweicloud_encryptionsdk/proof/collector/key_pair_proof_collector.py +55 -0
- huaweicloud_encryptionsdk/proof/collector/ma_proof_collector.py +51 -0
- huaweicloud_encryptionsdk/proof/private_key_decrypt_callback.py +7 -0
- huaweicloud_encryptionsdk/proof/proof_collector.py +11 -0
- huaweicloud_encryptionsdk/proof/proof_collector_factory.py +53 -0
- huaweicloud_encryptionsdk/proof/proof_info.py +10 -0
- huaweicloud_encryptionsdk/util/__init__.py +0 -0
- huaweicloud_encryptionsdk/util/common_utils.py +12 -0
- tests/__init__.py +0 -0
- tests/test_enums.py +84 -0
- tests/test_exceptions.py +38 -0
- tests/test_factories.py +71 -0
- tests/test_huawei_crypto.py +67 -0
- tests/test_imports.py +46 -0
- tests/test_kms_models.py +95 -0
- tests/test_log_file_backup.py +45 -0
- tests/test_lts_struct_log_builder.py +97 -0
- tests/test_models.py +142 -0
- tests/test_utils.py +111 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import threading
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.retry_queue import RetryQueue
|
|
5
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import common
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Mover(threading.Thread):
|
|
9
|
+
def __init__(self, io_worker, accumulator, io_thread_pool, config):
|
|
10
|
+
super().__init__()
|
|
11
|
+
self._io_worker = io_worker
|
|
12
|
+
self._accumulator = accumulator
|
|
13
|
+
self._io_thread_pool = io_thread_pool
|
|
14
|
+
self._retry_queue = RetryQueue()
|
|
15
|
+
self._config = config
|
|
16
|
+
|
|
17
|
+
def run(self):
|
|
18
|
+
while True:
|
|
19
|
+
sleep_ms = self._config.linger_ms
|
|
20
|
+
now_time_ms = common.current_time_ms()
|
|
21
|
+
self._accumulator.accumulator_lock.acquire_write()
|
|
22
|
+
try:
|
|
23
|
+
if self._accumulator.log_batch_map is None:
|
|
24
|
+
map_count = 0
|
|
25
|
+
else:
|
|
26
|
+
map_count = len(self._accumulator.log_batch_map)
|
|
27
|
+
for key, batch in self._accumulator.log_batch_map.items():
|
|
28
|
+
time_interval = batch.create_time_ms + self._config.linger_ms - now_time_ms
|
|
29
|
+
if time_interval <= 0:
|
|
30
|
+
self._mover_send_to_server(key, batch, self._config)
|
|
31
|
+
else:
|
|
32
|
+
if sleep_ms > time_interval:
|
|
33
|
+
sleep_ms = time_interval
|
|
34
|
+
finally:
|
|
35
|
+
self._accumulator.accumulator_lock.release_write()
|
|
36
|
+
|
|
37
|
+
if map_count == 0:
|
|
38
|
+
sleep_ms = self._config.linger_ms
|
|
39
|
+
|
|
40
|
+
retry_batch_list = self._retry_queue.get_retry_batch()
|
|
41
|
+
if retry_batch_list is None or len(retry_batch_list) == 0:
|
|
42
|
+
time.sleep(sleep_ms / 1000)
|
|
43
|
+
else:
|
|
44
|
+
for retry_batch in retry_batch_list:
|
|
45
|
+
self._io_thread_pool.add_task(retry_batch)
|
|
46
|
+
|
|
47
|
+
self._accumulator.accumulator_lock.acquire_write()
|
|
48
|
+
try:
|
|
49
|
+
if self._accumulator.log_batch_map is not None:
|
|
50
|
+
for key, batch in self._accumulator.log_batch_map.items():
|
|
51
|
+
self._io_thread_pool.add_task(batch)
|
|
52
|
+
|
|
53
|
+
self._accumulator.log_batch_map = {}
|
|
54
|
+
|
|
55
|
+
finally:
|
|
56
|
+
self._accumulator.accumulator_lock.release_write()
|
|
57
|
+
|
|
58
|
+
batch_list = self._retry_queue.get_retry_batch()
|
|
59
|
+
if batch_list is not None:
|
|
60
|
+
for batch in batch_list:
|
|
61
|
+
self._io_thread_pool.add_task(batch)
|
|
62
|
+
|
|
63
|
+
def _mover_send_to_server(self, key, batch, config):
|
|
64
|
+
if key not in self._accumulator.log_batch_map:
|
|
65
|
+
return
|
|
66
|
+
if common.current_time_ms() - self._accumulator.log_batch_map.get(key).create_time_ms < config.linger_ms:
|
|
67
|
+
return
|
|
68
|
+
self._io_thread_pool.add_task(batch)
|
|
69
|
+
self._accumulator.log_batch_map.pop(key)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.callback.call_back import CallBack
|
|
2
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.core.accumulator import Accumulator
|
|
3
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.core.io_thread_pool import IOThreadPool
|
|
4
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.core.io_worker import IOWorker
|
|
5
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.core.mover import Mover
|
|
6
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model import error
|
|
7
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.config import Config
|
|
8
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.log import Log
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Producer(object):
|
|
12
|
+
|
|
13
|
+
def __init__(self, config):
|
|
14
|
+
if config is None:
|
|
15
|
+
config = Config()
|
|
16
|
+
self._producer_config = config.validate_config()
|
|
17
|
+
self._io_worker = None
|
|
18
|
+
self._accumulator = None
|
|
19
|
+
self._io_thread_pool = None
|
|
20
|
+
self._mover = None
|
|
21
|
+
self._buckets = config.bucket
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def init_producer(producer_config):
|
|
25
|
+
producer = Producer(producer_config)
|
|
26
|
+
|
|
27
|
+
io_worker = IOWorker(producer_config.max_io_workers, producer_config.no_retry_code_list, producer)
|
|
28
|
+
io_thread_pool = IOThreadPool(io_worker)
|
|
29
|
+
accumulator = Accumulator.init_accumulator(producer_config, io_worker, producer, io_thread_pool)
|
|
30
|
+
mover = Mover(io_worker, accumulator, io_thread_pool, producer_config)
|
|
31
|
+
producer.io_thread_pool = io_thread_pool
|
|
32
|
+
producer.accumulator = accumulator
|
|
33
|
+
producer.io_worker = io_worker
|
|
34
|
+
producer.mover = mover
|
|
35
|
+
return producer
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def producer_config(self):
|
|
39
|
+
return self._producer_config
|
|
40
|
+
|
|
41
|
+
@producer_config.setter
|
|
42
|
+
def producer_config(self, value):
|
|
43
|
+
self._producer_config = value
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def io_worker(self):
|
|
47
|
+
return self._io_worker
|
|
48
|
+
|
|
49
|
+
@io_worker.setter
|
|
50
|
+
def io_worker(self, value):
|
|
51
|
+
self._io_worker = value
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def buckets(self):
|
|
55
|
+
return self._buckets
|
|
56
|
+
|
|
57
|
+
@buckets.setter
|
|
58
|
+
def buckets(self, value):
|
|
59
|
+
self._buckets = value
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def accumulator(self):
|
|
63
|
+
return self._accumulator
|
|
64
|
+
|
|
65
|
+
@accumulator.setter
|
|
66
|
+
def accumulator(self, value):
|
|
67
|
+
self._accumulator = value
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def io_thread_pool(self):
|
|
71
|
+
return self._io_thread_pool
|
|
72
|
+
|
|
73
|
+
@io_thread_pool.setter
|
|
74
|
+
def io_thread_pool(self, value):
|
|
75
|
+
self._io_thread_pool = value
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def mover(self):
|
|
79
|
+
return self._mover
|
|
80
|
+
|
|
81
|
+
@mover.setter
|
|
82
|
+
def mover(self, value):
|
|
83
|
+
self._mover = value
|
|
84
|
+
|
|
85
|
+
def start_producer(self):
|
|
86
|
+
self._mover.name = "lts-mover-thread"
|
|
87
|
+
self._mover.start()
|
|
88
|
+
self._io_thread_pool.name = "lts-io-thread-pool-thread"
|
|
89
|
+
self._io_thread_pool.start()
|
|
90
|
+
|
|
91
|
+
def send_log(self, group_id: str, stream_id: str, log: Log):
|
|
92
|
+
return self._accumulator.add_log_to_log_batch_map(log, group_id, stream_id, None)
|
|
93
|
+
|
|
94
|
+
def send_log_with_callback(self, group_id: str, stream_id: str, log: Log, call_back: CallBack):
|
|
95
|
+
if call_back is None:
|
|
96
|
+
return error.Error(error_code=error.PARAMETER_ERROR_CODE,
|
|
97
|
+
error_msg="call back fn is None, please check")
|
|
98
|
+
return self._accumulator.add_log_to_log_batch_map(log, group_id, stream_id, call_back)
|
|
File without changes
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
import urllib3
|
|
3
|
+
from loguru import logger
|
|
4
|
+
from requests.adapters import HTTPAdapter
|
|
5
|
+
from urllib3.exceptions import InsecureRequestWarning
|
|
6
|
+
from urllib3.util.retry import Retry
|
|
7
|
+
|
|
8
|
+
from huaweicloud_encryptionsdk._lts_sdk.auth.signer import Signer
|
|
9
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.lts_http.simple_request import LtsRequest
|
|
10
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model import error
|
|
11
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.config import Config
|
|
12
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.log import LogGroup
|
|
13
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import common
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class HttpClient(object):
|
|
17
|
+
def __init__(self):
|
|
18
|
+
self._session = requests.Session()
|
|
19
|
+
self._signer = Signer()
|
|
20
|
+
|
|
21
|
+
retry_strategy = Retry(
|
|
22
|
+
total=2,
|
|
23
|
+
status_forcelist=[429, 500, 502, 503, 504],
|
|
24
|
+
backoff_factor=1
|
|
25
|
+
)
|
|
26
|
+
adapter = HTTPAdapter(max_retries=retry_strategy, pool_connections=100, pool_maxsize=100)
|
|
27
|
+
self._session.mount("https://", adapter)
|
|
28
|
+
self._session.mount("http://", adapter)
|
|
29
|
+
urllib3.disable_warnings(InsecureRequestWarning)
|
|
30
|
+
|
|
31
|
+
def put_logs(self, group_id, stream_id, log_group: LogGroup, config: Config):
|
|
32
|
+
if log_group is None or len(log_group.log_items) == 0:
|
|
33
|
+
return None
|
|
34
|
+
|
|
35
|
+
log_num = 0
|
|
36
|
+
for item in log_group.log_items:
|
|
37
|
+
log_num += len(item.contents)
|
|
38
|
+
|
|
39
|
+
body = common.convert_obj2_json_str(log_group)
|
|
40
|
+
header = {"content-type": "application/json"}
|
|
41
|
+
|
|
42
|
+
interface = "/v2/internal/{0}/lts/groups/{1}/streams/{2}/tenant/batch-contents".format(config.project_id,
|
|
43
|
+
group_id, stream_id)
|
|
44
|
+
|
|
45
|
+
req = LtsRequest(method="POST", host=config.endpoint, headers=header, body=body, region=config.region_id,
|
|
46
|
+
interface=interface, ak=config.access_key, sk=config.access_secret,
|
|
47
|
+
security_token=config.security_token)
|
|
48
|
+
request = self._signer.sign(req)
|
|
49
|
+
r = request.prepare()
|
|
50
|
+
try:
|
|
51
|
+
logger.info("start send log num is {}", log_num)
|
|
52
|
+
response = self._session.send(r, verify=False)
|
|
53
|
+
response.encoding = "utf-8"
|
|
54
|
+
logger.info("send log status code {}, response is {}, send log num {}", response.status_code,
|
|
55
|
+
response.content.decode("utf-8"), log_num)
|
|
56
|
+
if response.status_code == 200:
|
|
57
|
+
return None
|
|
58
|
+
else:
|
|
59
|
+
return error.Error(error_code=error.HTTP_QUEST_ERROR_CODE, error_msg=response.content.decode("utf-8"),
|
|
60
|
+
http_code=response.status_code)
|
|
61
|
+
except Exception as e:
|
|
62
|
+
logger.error("send log error {}, log num {}", e, log_num)
|
|
63
|
+
return error.Error(error_code=error.HTTP_QUEST_ERROR_CODE, error_msg=str(e), http_code=0)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
class LtsRequest(object):
|
|
3
|
+
|
|
4
|
+
def __init__(self, method, host, headers, body, region, interface, ak, sk, security_token="", **kwargs):
|
|
5
|
+
self.body = body
|
|
6
|
+
self.method = method
|
|
7
|
+
self.headers = headers
|
|
8
|
+
self.host = host
|
|
9
|
+
self.query = kwargs
|
|
10
|
+
self.region = region
|
|
11
|
+
self.interface = interface
|
|
12
|
+
self.ak = ak
|
|
13
|
+
self.sk = sk
|
|
14
|
+
self.security_token = security_token
|
|
File without changes
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
class Config(object):
|
|
2
|
+
|
|
3
|
+
def __init__(self, max_block_sec=0, max_io_workers=200, batch_size_threshold_in_bytes=512 * 1024,
|
|
4
|
+
batch_count_threshold=4096, linger_ms=2000, retries=3, base_retry_backoff_ms=100,
|
|
5
|
+
max_retry_backoff_ms=5000, http_max_timeout_sec=60, bucket=64,
|
|
6
|
+
no_retry_code_list=None, total_size_in_bytes=100 * 1024 * 1024,
|
|
7
|
+
max_reserved_attempts=11):
|
|
8
|
+
if no_retry_code_list is None:
|
|
9
|
+
no_retry_code_list = {413, 429}
|
|
10
|
+
self.max_block_sec = max_block_sec
|
|
11
|
+
self.max_io_workers = max_io_workers
|
|
12
|
+
self.batch_size_threshold_in_bytes = batch_size_threshold_in_bytes
|
|
13
|
+
self.batch_count_threshold = batch_count_threshold
|
|
14
|
+
self.linger_ms = linger_ms
|
|
15
|
+
self.retries = retries
|
|
16
|
+
self.base_retry_backoff_ms = base_retry_backoff_ms
|
|
17
|
+
self.max_retry_backoff_ms = max_retry_backoff_ms
|
|
18
|
+
self.http_max_timeout_sec = http_max_timeout_sec
|
|
19
|
+
self.bucket = bucket
|
|
20
|
+
self.no_retry_code_list = no_retry_code_list
|
|
21
|
+
self.total_size_in_bytes = total_size_in_bytes
|
|
22
|
+
self.max_reserved_attempts = max_reserved_attempts
|
|
23
|
+
|
|
24
|
+
self.endpoint = ""
|
|
25
|
+
self.access_key = ""
|
|
26
|
+
self.access_secret = ""
|
|
27
|
+
self.security_token = ""
|
|
28
|
+
self.project_id = ""
|
|
29
|
+
self.region_id = ""
|
|
30
|
+
|
|
31
|
+
def validate_config(self):
|
|
32
|
+
if self.max_reserved_attempts <= 0:
|
|
33
|
+
self.max_reserved_attempts = 11
|
|
34
|
+
if self.batch_count_threshold > 40960 or self.batch_count_threshold <= 0:
|
|
35
|
+
self.batch_count_threshold = 40960
|
|
36
|
+
if self.batch_size_threshold_in_bytes > 512 * 1024 or self.batch_size_threshold_in_bytes <= 0:
|
|
37
|
+
self.batch_size_threshold_in_bytes = 512 * 1024
|
|
38
|
+
|
|
39
|
+
if self.max_io_workers <= 0:
|
|
40
|
+
self.max_io_workers = 10
|
|
41
|
+
|
|
42
|
+
if self.base_retry_backoff_ms <= 0:
|
|
43
|
+
self.base_retry_backoff_ms = 100
|
|
44
|
+
|
|
45
|
+
if self.total_size_in_bytes <= 0:
|
|
46
|
+
self.total_size_in_bytes = 100 * 1024 * 1024
|
|
47
|
+
|
|
48
|
+
if self.linger_ms < 100:
|
|
49
|
+
self.linger_ms = 2000
|
|
50
|
+
return self
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import common
|
|
2
|
+
|
|
3
|
+
PARAMETER_ERROR_CODE = "0000001"
|
|
4
|
+
ADD_LOG_TO_BATCH_ERROR_CODE = "0000002"
|
|
5
|
+
ADD_LOG_WAIT_TIMEOUT_ERROR_CODE = "0000003"
|
|
6
|
+
HTTP_QUEST_ERROR_CODE = "0000004"
|
|
7
|
+
RESULT_JSON_FORMAT_ERROR_CODE = "0000005"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Error(object):
|
|
11
|
+
def __init__(self, error_code: str, error_msg: str, http_code: int = 0, request_id: str = ""):
|
|
12
|
+
self.http_code = http_code
|
|
13
|
+
self.error_code = error_code
|
|
14
|
+
self.error_msg = error_msg
|
|
15
|
+
self.request_id = request_id
|
|
16
|
+
|
|
17
|
+
def __str__(self):
|
|
18
|
+
return common.convert_obj2_json_str(self)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils.common import solv_log
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class LogContent(object):
|
|
7
|
+
def __init__(self, log_time_ns: int, log: str):
|
|
8
|
+
self.log_time_ns = log_time_ns
|
|
9
|
+
self.log = log
|
|
10
|
+
|
|
11
|
+
def getSize(self) -> int:
|
|
12
|
+
log_length = 0
|
|
13
|
+
if self.log:
|
|
14
|
+
log_length += len(self.log)
|
|
15
|
+
|
|
16
|
+
return log_length + solv_log(self.log_time_ns)
|
|
17
|
+
|
|
18
|
+
def __len__(self) -> int:
|
|
19
|
+
log_length = 0
|
|
20
|
+
if self.log:
|
|
21
|
+
log_length += len(self.log)
|
|
22
|
+
|
|
23
|
+
return log_length + solv_log(self.log_time_ns)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Log(object):
|
|
27
|
+
def __init__(self, contents: List[LogContent], labels: str):
|
|
28
|
+
self.contents = contents
|
|
29
|
+
self.labels = labels
|
|
30
|
+
|
|
31
|
+
def getSize(self) -> int:
|
|
32
|
+
log_length = 0
|
|
33
|
+
l = 0
|
|
34
|
+
if self.contents is None or len(self.contents) == 0:
|
|
35
|
+
return log_length
|
|
36
|
+
|
|
37
|
+
for content in self.contents:
|
|
38
|
+
if content is None:
|
|
39
|
+
l = 0
|
|
40
|
+
else:
|
|
41
|
+
l = content.getSize()
|
|
42
|
+
|
|
43
|
+
log_length += 1 + l + solv_log(l)
|
|
44
|
+
return log_length
|
|
45
|
+
|
|
46
|
+
def __len__(self) -> int:
|
|
47
|
+
log_length = 0
|
|
48
|
+
l = 0
|
|
49
|
+
if self.contents is None or len(self.contents) == 0:
|
|
50
|
+
return log_length
|
|
51
|
+
|
|
52
|
+
for content in self.contents:
|
|
53
|
+
if content is None:
|
|
54
|
+
l = 0
|
|
55
|
+
else:
|
|
56
|
+
l = len(content)
|
|
57
|
+
|
|
58
|
+
log_length += 1 + l + solv_log(l)
|
|
59
|
+
return log_length
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class LogGroup(object):
|
|
63
|
+
def __init__(self, log_items: List[Log]):
|
|
64
|
+
self.log_items = log_items
|
|
65
|
+
|
|
66
|
+
def is_empty_logs(self):
|
|
67
|
+
return self.log_items is None or len(self.log_items) == 0
|
|
68
|
+
|
|
69
|
+
def getSize(self) -> int:
|
|
70
|
+
log_length = 0
|
|
71
|
+
l = 0
|
|
72
|
+
|
|
73
|
+
if not self.is_empty_logs():
|
|
74
|
+
for log_item in self.log_items:
|
|
75
|
+
l = log_item.getSize()
|
|
76
|
+
log_length += 1 + l + solv_log(l)
|
|
77
|
+
return log_length
|
|
78
|
+
|
|
79
|
+
def __len__(self) -> int:
|
|
80
|
+
log_length = 0
|
|
81
|
+
l = 0
|
|
82
|
+
|
|
83
|
+
if not self.is_empty_logs():
|
|
84
|
+
for log_item in self.log_items:
|
|
85
|
+
l = len(log_item)
|
|
86
|
+
log_length += 1 + l + solv_log(l)
|
|
87
|
+
return log_length
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import threading
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.config import Config
|
|
5
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.log import LogGroup, Log
|
|
6
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.result import Result
|
|
7
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import common
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LogBatch(object):
|
|
11
|
+
def __init__(self):
|
|
12
|
+
self._log_group = None
|
|
13
|
+
self._total_data_size = 0
|
|
14
|
+
self._log_group_count = 0
|
|
15
|
+
self._attempt_count = 0
|
|
16
|
+
self.lock = threading.Lock()
|
|
17
|
+
self._call_back_list = []
|
|
18
|
+
self._group_id = None
|
|
19
|
+
self._stream_id = None
|
|
20
|
+
self._config = None
|
|
21
|
+
self._create_time_ms = common.current_time_ms()
|
|
22
|
+
self._result = Result()
|
|
23
|
+
self._next_retry_ms = 0
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def result(self):
|
|
27
|
+
return self._result
|
|
28
|
+
|
|
29
|
+
@result.setter
|
|
30
|
+
def result(self, value):
|
|
31
|
+
self._result = value
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def next_retry_ms(self):
|
|
35
|
+
return self._next_retry_ms
|
|
36
|
+
|
|
37
|
+
@next_retry_ms.setter
|
|
38
|
+
def next_retry_ms(self, value):
|
|
39
|
+
self._next_retry_ms = value
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def create_time_ms(self) -> int:
|
|
43
|
+
return self._create_time_ms
|
|
44
|
+
|
|
45
|
+
@create_time_ms.setter
|
|
46
|
+
def create_time_ms(self, value: int):
|
|
47
|
+
self._create_time_ms = value
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def total_data_size(self) -> int:
|
|
51
|
+
return self._total_data_size
|
|
52
|
+
|
|
53
|
+
@total_data_size.setter
|
|
54
|
+
def total_data_size(self, value: int):
|
|
55
|
+
self._total_data_size = value
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def log_group_count(self) -> int:
|
|
59
|
+
return self._log_group_count
|
|
60
|
+
|
|
61
|
+
@log_group_count.setter
|
|
62
|
+
def log_group_count(self, value: int):
|
|
63
|
+
self._log_group_count = value
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def attempt_count(self) -> int:
|
|
67
|
+
return self._attempt_count
|
|
68
|
+
|
|
69
|
+
@attempt_count.setter
|
|
70
|
+
def attempt_count(self, value: int):
|
|
71
|
+
self._attempt_count = value
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def log_group(self) -> LogGroup:
|
|
75
|
+
return self._log_group
|
|
76
|
+
|
|
77
|
+
@log_group.setter
|
|
78
|
+
def log_group(self, value: LogGroup):
|
|
79
|
+
self._log_group = value
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def group_id(self) -> str:
|
|
83
|
+
return self._group_id
|
|
84
|
+
|
|
85
|
+
@group_id.setter
|
|
86
|
+
def group_id(self, value: str):
|
|
87
|
+
self._group_id = value
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def stream_id(self) -> str:
|
|
91
|
+
return self._stream_id
|
|
92
|
+
|
|
93
|
+
@stream_id.setter
|
|
94
|
+
def stream_id(self, value: str):
|
|
95
|
+
self._stream_id = value
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def config(self) -> Config:
|
|
99
|
+
return self._config
|
|
100
|
+
|
|
101
|
+
@config.setter
|
|
102
|
+
def config(self, value: Config):
|
|
103
|
+
self._config = value
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def call_back_list(self):
|
|
107
|
+
return self._call_back_list
|
|
108
|
+
|
|
109
|
+
@call_back_list.setter
|
|
110
|
+
def call_back_list(self, value):
|
|
111
|
+
self._call_back_list = value
|
|
112
|
+
|
|
113
|
+
def add_attempt(self, attempt):
|
|
114
|
+
if attempt is None:
|
|
115
|
+
return
|
|
116
|
+
if self._result is None:
|
|
117
|
+
self._result = Result()
|
|
118
|
+
if self._result.attempt_list is None:
|
|
119
|
+
self._result.attempt_list = []
|
|
120
|
+
self._result.attempt_list.append(attempt)
|
|
121
|
+
|
|
122
|
+
def add_call_back(self, call_back):
|
|
123
|
+
if call_back is None:
|
|
124
|
+
return
|
|
125
|
+
else:
|
|
126
|
+
self._call_back_list.append(call_back)
|
|
127
|
+
|
|
128
|
+
def add_log_to_log_group(self, log: Log):
|
|
129
|
+
self.log_group.log_items.append(log)
|
|
130
|
+
|
|
131
|
+
def add_total_data_size(self, delta):
|
|
132
|
+
self._total_data_size += delta
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def init_product_batch_var_single_log(log_data: Log, call_back, group_id: str, stream_id: str, config: Config):
|
|
136
|
+
logs = [log_data]
|
|
137
|
+
log_group = LogGroup(log_items=logs)
|
|
138
|
+
return _producer_batch(call_back, group_id, stream_id, config, log_group)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def init_product_batch_var_multi_log(log_data: List[Log], call_back, group_id: str, stream_id: str, config: Config):
|
|
142
|
+
log_group = LogGroup(log_items=log_data)
|
|
143
|
+
return _producer_batch(call_back, group_id, stream_id, config, log_group)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def _producer_batch(call_back, group_id: str, stream_id: str, config: Config, log_group: LogGroup):
|
|
147
|
+
log_batch = LogBatch()
|
|
148
|
+
log_batch.log_group = log_group
|
|
149
|
+
log_batch.add_call_back(call_back)
|
|
150
|
+
log_batch._group_id = group_id
|
|
151
|
+
log_batch.stream_id = stream_id
|
|
152
|
+
log_batch.config = config
|
|
153
|
+
log_batch.total_data_size = log_group.getSize()
|
|
154
|
+
return log_batch
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import time
|
|
3
|
+
from typing import List
|
|
4
|
+
|
|
5
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.log import Log, LogContent
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def generate_log(log_list: List[str], labels: dict) -> Log:
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
:rtype: object
|
|
12
|
+
"""
|
|
13
|
+
log_contents = []
|
|
14
|
+
for log_str in log_list:
|
|
15
|
+
log_content = LogContent(time.time_ns(), log_str)
|
|
16
|
+
log_contents.append(log_content)
|
|
17
|
+
|
|
18
|
+
label_str = ""
|
|
19
|
+
if labels is not None:
|
|
20
|
+
label_str = json.dumps(labels)
|
|
21
|
+
return Log(contents=log_contents, labels=label_str)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
class Attempt(object):
|
|
3
|
+
def __init__(self, success, http_code, request_id, error_code, error_msg, time_stamp_ms, last_attempt_cost_ms):
|
|
4
|
+
self.success = success
|
|
5
|
+
self.http_code = http_code
|
|
6
|
+
self.request_id = request_id
|
|
7
|
+
self.error_code = error_code
|
|
8
|
+
self.error_msg = error_msg
|
|
9
|
+
self.time_stamp_ms = time_stamp_ms
|
|
10
|
+
self.last_attempt_cost_ms = last_attempt_cost_ms
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Result(object):
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.attempt_list = []
|
|
16
|
+
self.success = False
|
|
17
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import queue
|
|
2
|
+
import threading
|
|
3
|
+
|
|
4
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model import log_batch
|
|
5
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import common
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RetryQueue(object):
|
|
9
|
+
|
|
10
|
+
def __init__(self):
|
|
11
|
+
self._batch_queue = queue.Queue()
|
|
12
|
+
self._lock = threading.Lock()
|
|
13
|
+
|
|
14
|
+
def send_to_retry_queue(self, batch: log_batch.LogBatch):
|
|
15
|
+
self._lock.acquire()
|
|
16
|
+
try:
|
|
17
|
+
if batch is not None:
|
|
18
|
+
self._batch_queue.put_nowait(batch)
|
|
19
|
+
finally:
|
|
20
|
+
self._lock.release()
|
|
21
|
+
|
|
22
|
+
def get_retry_batch(self):
|
|
23
|
+
retry_batch_list = []
|
|
24
|
+
self._lock.acquire()
|
|
25
|
+
try:
|
|
26
|
+
while not self._batch_queue.empty():
|
|
27
|
+
retry_batch = self._batch_queue.get_nowait()
|
|
28
|
+
if retry_batch.next_retry_ms() < common.current_time_ms():
|
|
29
|
+
retry_batch_list.append(retry_batch)
|
|
30
|
+
else:
|
|
31
|
+
self._batch_queue.put_nowait(retry_batch)
|
|
32
|
+
return retry_batch_list
|
|
33
|
+
finally:
|
|
34
|
+
self._lock.release()
|
|
35
|
+
|
|
36
|
+
def length(self):
|
|
37
|
+
if self._batch_queue is None:
|
|
38
|
+
return 0
|
|
39
|
+
return self._batch_queue.qsize()
|