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.
Files changed (174) hide show
  1. examples/file_encryption_example.py +57 -0
  2. examples/key_capsule_encryption_example.py +240 -0
  3. examples/kms_discovery_encryption_example.py +56 -0
  4. examples/local_aes_encryption_example.py +59 -0
  5. examples/test_rsa.py +42 -0
  6. examples/test_sm2.py +38 -0
  7. examples/test_sm4_cbc.py +37 -0
  8. examples/test_sm4_gcm.py +37 -0
  9. huaweicloud_encryption_sdk_python-1.2.1.dist-info/METADATA +18 -0
  10. huaweicloud_encryption_sdk_python-1.2.1.dist-info/RECORD +174 -0
  11. huaweicloud_encryption_sdk_python-1.2.1.dist-info/WHEEL +5 -0
  12. huaweicloud_encryption_sdk_python-1.2.1.dist-info/top_level.txt +3 -0
  13. huaweicloud_encryptionsdk/__init__.py +5 -0
  14. huaweicloud_encryptionsdk/_apig_sdk/__init__.py +1 -0
  15. huaweicloud_encryptionsdk/_apig_sdk/signer.py +278 -0
  16. huaweicloud_encryptionsdk/_apig_sdk/signer_v11.py +70 -0
  17. huaweicloud_encryptionsdk/_apig_sdk/sm3_hash.py +141 -0
  18. huaweicloud_encryptionsdk/_lts_sdk/auth/__init__.py +0 -0
  19. huaweicloud_encryptionsdk/_lts_sdk/auth/signer.py +174 -0
  20. huaweicloud_encryptionsdk/_lts_sdk/consumer/__init__.py +0 -0
  21. huaweicloud_encryptionsdk/_lts_sdk/consumer/client/__init__.py +0 -0
  22. huaweicloud_encryptionsdk/_lts_sdk/consumer/client/consumer_client_adapter.py +59 -0
  23. huaweicloud_encryptionsdk/_lts_sdk/consumer/client/http_client.py +211 -0
  24. huaweicloud_encryptionsdk/_lts_sdk/consumer/core/__init__.py +0 -0
  25. huaweicloud_encryptionsdk/_lts_sdk/consumer/core/client_consumer_worker.py +106 -0
  26. huaweicloud_encryptionsdk/_lts_sdk/consumer/core/consumer_heartbeat.py +73 -0
  27. huaweicloud_encryptionsdk/_lts_sdk/consumer/core/log_shard_consumer.py +179 -0
  28. huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/__init__.py +0 -0
  29. huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_check_point_tracker.py +120 -0
  30. huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor.py +18 -0
  31. huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor_factory.py +3 -0
  32. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/__init__.py +0 -0
  33. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/check_point.py +20 -0
  34. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/consumer_config.py +27 -0
  35. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/log_data.py +18 -0
  36. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/task_result.py +40 -0
  37. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/__init__.py +0 -0
  38. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/consumer_fetch_task.py +53 -0
  39. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/initial_task.py +55 -0
  40. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/process_task.py +25 -0
  41. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/shutdown_task.py +24 -0
  42. huaweicloud_encryptionsdk/_lts_sdk/consumer_main.py +88 -0
  43. huaweicloud_encryptionsdk/_lts_sdk/parallel_main.py +64 -0
  44. huaweicloud_encryptionsdk/_lts_sdk/producer/__init__.py +0 -0
  45. huaweicloud_encryptionsdk/_lts_sdk/producer/callback/__init__.py +0 -0
  46. huaweicloud_encryptionsdk/_lts_sdk/producer/callback/call_back.py +7 -0
  47. huaweicloud_encryptionsdk/_lts_sdk/producer/core/__init__.py +0 -0
  48. huaweicloud_encryptionsdk/_lts_sdk/producer/core/accumulator.py +135 -0
  49. huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_thread_pool.py +107 -0
  50. huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_worker.py +124 -0
  51. huaweicloud_encryptionsdk/_lts_sdk/producer/core/mover.py +69 -0
  52. huaweicloud_encryptionsdk/_lts_sdk/producer/core/producer.py +98 -0
  53. huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/__init__.py +0 -0
  54. huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/http_client.py +63 -0
  55. huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/simple_request.py +14 -0
  56. huaweicloud_encryptionsdk/_lts_sdk/producer/model/__init__.py +0 -0
  57. huaweicloud_encryptionsdk/_lts_sdk/producer/model/config.py +50 -0
  58. huaweicloud_encryptionsdk/_lts_sdk/producer/model/error.py +18 -0
  59. huaweicloud_encryptionsdk/_lts_sdk/producer/model/log.py +87 -0
  60. huaweicloud_encryptionsdk/_lts_sdk/producer/model/log_batch.py +154 -0
  61. huaweicloud_encryptionsdk/_lts_sdk/producer/model/lts_store.py +21 -0
  62. huaweicloud_encryptionsdk/_lts_sdk/producer/model/result.py +17 -0
  63. huaweicloud_encryptionsdk/_lts_sdk/producer/model/retry_queue.py +39 -0
  64. huaweicloud_encryptionsdk/_lts_sdk/serial_main.py +77 -0
  65. huaweicloud_encryptionsdk/_lts_sdk/utils/__init__.py +0 -0
  66. huaweicloud_encryptionsdk/_lts_sdk/utils/common.py +57 -0
  67. huaweicloud_encryptionsdk/_lts_sdk/utils/lts_threading.py +32 -0
  68. huaweicloud_encryptionsdk/cache/__init__.py +0 -0
  69. huaweicloud_encryptionsdk/cache/data_key_cache.py +79 -0
  70. huaweicloud_encryptionsdk/cache/local_data_key_cache.py +161 -0
  71. huaweicloud_encryptionsdk/common/__init__.py +0 -0
  72. huaweicloud_encryptionsdk/common/constants.py +15 -0
  73. huaweicloud_encryptionsdk/common/counting_output_stream.py +18 -0
  74. huaweicloud_encryptionsdk/common/crypto_factory.py +48 -0
  75. huaweicloud_encryptionsdk/common/ec_private_key_loader.py +43 -0
  76. huaweicloud_encryptionsdk/common/ecs_metadata_service.py +42 -0
  77. huaweicloud_encryptionsdk/common/file_path_for_example_constants.py +4 -0
  78. huaweicloud_encryptionsdk/common/utils.py +162 -0
  79. huaweicloud_encryptionsdk/exception/__init__.py +0 -0
  80. huaweicloud_encryptionsdk/exception/errors.py +109 -0
  81. huaweicloud_encryptionsdk/handler/__init__.py +0 -0
  82. huaweicloud_encryptionsdk/handler/cipher_handler.py +294 -0
  83. huaweicloud_encryptionsdk/handler/crypto_handler.py +24 -0
  84. huaweicloud_encryptionsdk/handler/default_crypto_handler.py +148 -0
  85. huaweicloud_encryptionsdk/handler/default_serialize_handler.py +45 -0
  86. huaweicloud_encryptionsdk/handler/file_decrypt_handler.py +101 -0
  87. huaweicloud_encryptionsdk/handler/file_encrypt_handler.py +30 -0
  88. huaweicloud_encryptionsdk/handler/serialize_handler.py +14 -0
  89. huaweicloud_encryptionsdk/huawei_config.py +49 -0
  90. huaweicloud_encryptionsdk/huawei_crypto.py +311 -0
  91. huaweicloud_encryptionsdk/keyrings/__init__.py +0 -0
  92. huaweicloud_encryptionsdk/keyrings/keyring.py +14 -0
  93. huaweicloud_encryptionsdk/keyrings/keyring_factory.py +10 -0
  94. huaweicloud_encryptionsdk/keyrings/kms_keyring_factory.py +21 -0
  95. huaweicloud_encryptionsdk/keyrings/kmskeyring/__init__.py +0 -0
  96. huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_discovery_keyring.py +51 -0
  97. huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_key_capsule_keyring.py +100 -0
  98. huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_keyring.py +155 -0
  99. huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_multi_region_keyring.py +8 -0
  100. huaweicloud_encryptionsdk/keyrings/raw_keyring_factory.py +27 -0
  101. huaweicloud_encryptionsdk/keyrings/rawkeyring/__init__.py +0 -0
  102. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_aes_keyring.py +63 -0
  103. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_keyring.py +112 -0
  104. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_rsa_keyring.py +55 -0
  105. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm2_keyring.py +75 -0
  106. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_cbc_keyring.py +66 -0
  107. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_keyring.py +70 -0
  108. huaweicloud_encryptionsdk/kms/__init__.py +0 -0
  109. huaweicloud_encryptionsdk/kms/create_key_capsule_request.py +35 -0
  110. huaweicloud_encryptionsdk/kms/create_key_capsule_response.py +19 -0
  111. huaweicloud_encryptionsdk/kms/decrypt_key_capsule_request.py +32 -0
  112. huaweicloud_encryptionsdk/kms/decrypt_key_capsule_response.py +19 -0
  113. huaweicloud_encryptionsdk/kms/kms_http_client.py +116 -0
  114. huaweicloud_encryptionsdk/log/__init__.py +0 -0
  115. huaweicloud_encryptionsdk/log/log_config.py +30 -0
  116. huaweicloud_encryptionsdk/log/log_file_backup.py +144 -0
  117. huaweicloud_encryptionsdk/log/log_metrics.py +132 -0
  118. huaweicloud_encryptionsdk/log/log_reporter_manager.py +163 -0
  119. huaweicloud_encryptionsdk/log/lts_sdk_producer.py +386 -0
  120. huaweicloud_encryptionsdk/log/lts_struct_log_builder.py +106 -0
  121. huaweicloud_encryptionsdk/meterialmanager/__init__.py +0 -0
  122. huaweicloud_encryptionsdk/meterialmanager/cache_crypto_meterial_manager.py +221 -0
  123. huaweicloud_encryptionsdk/meterialmanager/crypto_meterial_manager.py +19 -0
  124. huaweicloud_encryptionsdk/meterialmanager/data_key_generate.py +10 -0
  125. huaweicloud_encryptionsdk/meterialmanager/data_key_generate_factory.py +20 -0
  126. huaweicloud_encryptionsdk/meterialmanager/default_crypto_meterials_manager.py +71 -0
  127. huaweicloud_encryptionsdk/meterialmanager/key_capsule_data_key_generate.py +63 -0
  128. huaweicloud_encryptionsdk/meterialmanager/kms_data_key_generate.py +65 -0
  129. huaweicloud_encryptionsdk/meterialmanager/local_data_key_generate.py +13 -0
  130. huaweicloud_encryptionsdk/model/__init__.py +0 -0
  131. huaweicloud_encryptionsdk/model/access_point_config.py +9 -0
  132. huaweicloud_encryptionsdk/model/cipher_body.py +81 -0
  133. huaweicloud_encryptionsdk/model/cipher_header.py +405 -0
  134. huaweicloud_encryptionsdk/model/ciphertext_data_key.py +166 -0
  135. huaweicloud_encryptionsdk/model/crypto_result.py +11 -0
  136. huaweicloud_encryptionsdk/model/data_key_materials.py +17 -0
  137. huaweicloud_encryptionsdk/model/data_materials.py +11 -0
  138. huaweicloud_encryptionsdk/model/enums/__init__.py +0 -0
  139. huaweicloud_encryptionsdk/model/enums/access_point_type.py +28 -0
  140. huaweicloud_encryptionsdk/model/enums/crypto_algorithm.py +75 -0
  141. huaweicloud_encryptionsdk/model/enums/data_key_generate_type.py +20 -0
  142. huaweicloud_encryptionsdk/model/enums/key_provider_enum.py +19 -0
  143. huaweicloud_encryptionsdk/model/enums/keyring_type_enum.py +27 -0
  144. huaweicloud_encryptionsdk/model/key_capsule.py +10 -0
  145. huaweicloud_encryptionsdk/model/key_capsule_config.py +12 -0
  146. huaweicloud_encryptionsdk/model/kms_config.py +10 -0
  147. huaweicloud_encryptionsdk/model/request/__init__.py +0 -0
  148. huaweicloud_encryptionsdk/model/request/encrypt_request.py +10 -0
  149. huaweicloud_encryptionsdk/model/request/sign_request.py +2 -0
  150. huaweicloud_encryptionsdk/model/request/verify_request.py +2 -0
  151. huaweicloud_encryptionsdk/proof/__init__.py +0 -0
  152. huaweicloud_encryptionsdk/proof/attestation_document.py +36 -0
  153. huaweicloud_encryptionsdk/proof/collector/__init__.py +0 -0
  154. huaweicloud_encryptionsdk/proof/collector/cce_proof_collector.py +24 -0
  155. huaweicloud_encryptionsdk/proof/collector/ecs_proof_collector.py +11 -0
  156. huaweicloud_encryptionsdk/proof/collector/key_pair_proof_collector.py +55 -0
  157. huaweicloud_encryptionsdk/proof/collector/ma_proof_collector.py +51 -0
  158. huaweicloud_encryptionsdk/proof/private_key_decrypt_callback.py +7 -0
  159. huaweicloud_encryptionsdk/proof/proof_collector.py +11 -0
  160. huaweicloud_encryptionsdk/proof/proof_collector_factory.py +53 -0
  161. huaweicloud_encryptionsdk/proof/proof_info.py +10 -0
  162. huaweicloud_encryptionsdk/util/__init__.py +0 -0
  163. huaweicloud_encryptionsdk/util/common_utils.py +12 -0
  164. tests/__init__.py +0 -0
  165. tests/test_enums.py +84 -0
  166. tests/test_exceptions.py +38 -0
  167. tests/test_factories.py +71 -0
  168. tests/test_huawei_crypto.py +67 -0
  169. tests/test_imports.py +46 -0
  170. tests/test_kms_models.py +95 -0
  171. tests/test_log_file_backup.py +45 -0
  172. tests/test_lts_struct_log_builder.py +97 -0
  173. tests/test_models.py +142 -0
  174. 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)
@@ -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
@@ -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()