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,55 @@
1
+ from loguru import logger
2
+
3
+ from consumer.client.consumer_client_adapter import LogConsumerClientAdapter
4
+ from consumer.interface.consumer_processor import ILogConsumerProcessor
5
+ from consumer.model.task_result import TaskResult, InitTaskResult
6
+ from huaweicloud_encryptionsdk._lts_sdk.utils import common
7
+
8
+
9
+ class InitializeTask(object):
10
+ def __init__(self, processor: ILogConsumerProcessor, client_adapter: LogConsumerClientAdapter, shard_id, start_time,
11
+ end_time):
12
+ self.processor = processor
13
+ self.client_adapter = client_adapter
14
+ self.shard_id = shard_id
15
+ self.start_time = start_time
16
+ self.end_time = end_time
17
+
18
+
19
+ def initialize_task(task: InitializeTask) -> TaskResult:
20
+ task.processor.initialize(task.shard_id)
21
+ err, shard_checkpoint_list = task.client_adapter.fetch_consumer_group(task.shard_id)
22
+ if err is not None:
23
+ logger.error("error fetching initial position: {}", err)
24
+ return TaskResult(err)
25
+ is_cursor_persistent = False
26
+ start_time_by_cursor = ""
27
+ end_time_by_cursor = ""
28
+ if task.end_time is not None and task.end_time != 0:
29
+ err, end_time_2_cursor = task.client_adapter.get_cursor_by_time(task.shard_id, str(task.end_time))
30
+ if err is not None:
31
+ logger.error("error fetching initial position, get cursor by time error: {}", err)
32
+ return TaskResult(err)
33
+ end_time_by_cursor = end_time_2_cursor.cursor
34
+ logger.debug("initialize task shardId {}, endTime {}, endTimeByCursor {}", task.shard_id, task.end_time,
35
+ end_time_by_cursor)
36
+
37
+ logger.debug("shard checkpoint list is {}", shard_checkpoint_list)
38
+ if shard_checkpoint_list is not None and len(shard_checkpoint_list) > 0:
39
+ shard_checkpoint = shard_checkpoint_list[0]
40
+ logger.debug("shard checkpoint is {}", shard_checkpoint)
41
+ is_cursor_persistent = True
42
+ start_time_by_cursor = shard_checkpoint.checkpoint
43
+ else:
44
+ if task.start_time is not None and task.start_time != 0:
45
+ err, start_time_2_cursor = task.client_adapter.get_cursor_by_time(task.shard_id, str(task.start_time))
46
+ if err is not None:
47
+ logger.error("error fetching initial position, get cursor by time error: {}", err)
48
+ return TaskResult(err)
49
+ start_time_by_cursor = start_time_2_cursor.cursor
50
+ logger.debug("initialize task shardId {}, endTime {}, endTimeByCursor {}", task.shard_id, task.start_time,
51
+ start_time_by_cursor)
52
+
53
+ logger.debug("initialize result, shardId {}, startTimeByCursor {}, endTimeByCursor {}, isCursorPersistent {}",
54
+ task.shard_id, start_time_by_cursor, end_time_by_cursor, is_cursor_persistent)
55
+ return InitTaskResult(start_time_by_cursor, end_time_by_cursor, is_cursor_persistent)
@@ -0,0 +1,25 @@
1
+ from consumer.interface.consumer_check_point_tracker import DefaultLogConsumerCheckPointTracker
2
+ from consumer.interface.consumer_processor import ILogConsumerProcessor
3
+ from consumer.model.task_result import TaskResult, ProcessTaskResult
4
+
5
+
6
+ class ProcessTask(object):
7
+ def __init__(self, processor: ILogConsumerProcessor, log_groups,
8
+ checkpoint_tracker: DefaultLogConsumerCheckPointTracker,
9
+ final_fetch_cursor):
10
+ self.processor = processor
11
+ self.chunk = log_groups
12
+ self.checkpoint_tracker = checkpoint_tracker
13
+ self.final_fetch_cursor = final_fetch_cursor
14
+
15
+
16
+ def process_task(task: ProcessTask) -> TaskResult:
17
+ task.checkpoint_tracker.pending_check_point = task.checkpoint_tracker.next_cursor
18
+ checkpoint = task.processor.process(task.chunk, task.checkpoint_tracker)
19
+ task.processor.shard_consumer_thread_success(task.checkpoint_tracker.shard_id,
20
+ task.final_fetch_cursor == task.checkpoint_tracker.next_cursor)
21
+ err = task.checkpoint_tracker.consume_data_end_flush_checkpoint()
22
+ if err is None:
23
+ return ProcessTaskResult(checkpoint)
24
+ else:
25
+ return TaskResult(err)
@@ -0,0 +1,24 @@
1
+ from loguru import logger
2
+
3
+ from consumer.interface.consumer_check_point_tracker import DefaultLogConsumerCheckPointTracker
4
+ from consumer.interface.consumer_processor import ILogConsumerProcessor
5
+ from consumer.model.task_result import TaskResult
6
+
7
+
8
+ class ShutDownTask(object):
9
+ def __init__(self, processor: ILogConsumerProcessor, checkpoint_tracker: DefaultLogConsumerCheckPointTracker):
10
+ self.processor = processor
11
+ self.checkpoint_tracker = checkpoint_tracker
12
+
13
+
14
+ def shutdown_task(task: ShutDownTask):
15
+ try:
16
+ task.processor.shutdown(task.checkpoint_tracker)
17
+ except Exception as e:
18
+ logger.error("could not shut down processor {}", e)
19
+
20
+ err = task.checkpoint_tracker.flush_check_point()
21
+ if err is not None:
22
+ return TaskResult(None)
23
+ else:
24
+ return TaskResult(err)
@@ -0,0 +1,88 @@
1
+ import argparse
2
+ import sys
3
+ import time
4
+ from typing import List
5
+
6
+ from loguru import logger
7
+
8
+ from consumer.core.client_consumer_worker import get_client_consumer_worker
9
+ from consumer.interface.consumer_check_point_tracker import ILogConsumerCheckPointTracker
10
+ from consumer.interface.consumer_processor import ILogConsumerProcessor
11
+ from consumer.interface.consumer_processor_factory import ILogConsumerProcessorFactory
12
+ from consumer.model.consumer_config import ConsumerConfig
13
+ from consumer.model.log_data import LogData
14
+
15
+
16
+ class DemoLogConsumerProcessor(ILogConsumerProcessor):
17
+
18
+ def __init__(self):
19
+ self.log_count = 0
20
+
21
+ def initialize(self, shard_id):
22
+ pass
23
+
24
+ def process(self, log_group: List[LogData], tracker: ILogConsumerCheckPointTracker) -> str:
25
+ self.log_count += len(log_group)
26
+ logger.info("this time consume log {} total log num {}", len(log_group), self.log_count)
27
+
28
+ def shutdown(self, tracker: ILogConsumerCheckPointTracker):
29
+ return tracker.save_check_point(True)
30
+
31
+
32
+ class DemoLogConsumerProcessorFactory(ILogConsumerProcessorFactory):
33
+ def generate_processor(self):
34
+ return DemoLogConsumerProcessor()
35
+
36
+
37
+ def start_consume(endpoint, region_name, project_id, log_group_id, log_stream_id, access_key, access_secret,
38
+ consumer_group_name, start_time, end_time, log_level, is_test, consumer_count, consume_batch_size):
39
+ logger.remove()
40
+ logger.add(sys.stderr, level=log_level)
41
+ if is_test:
42
+ logger.add("/opt/cloud/log.log", level="DEBUG")
43
+ logger.info("start time {}, end time {}", start_time, end_time)
44
+ workers = []
45
+
46
+ for i in range(consumer_count):
47
+ config = ConsumerConfig(endpoint, region_name, project_id, log_group_id, log_stream_id, access_key,
48
+ access_secret, consumer_group_name, start_time, end_time, consume_batch_size)
49
+ work = get_client_consumer_worker(DemoLogConsumerProcessorFactory(), config)
50
+ if work is None:
51
+ logger.error("get work error, work is none")
52
+ else:
53
+ workers.append(work)
54
+
55
+ for work in workers:
56
+ work.start()
57
+
58
+ time.sleep(30000 * 60)
59
+ for work in workers:
60
+ work.shutdown()
61
+
62
+ time.sleep(60)
63
+
64
+
65
+ if __name__ == '__main__':
66
+ parser = argparse.ArgumentParser(description='lts python sdk consume log help tester information')
67
+ parser.add_argument('--endpoint', dest='endpoint', type=str, help='lts endpoint', default="https://endpoint")
68
+ parser.add_argument('--project_id', dest='project_id', type=str, help='huaweicloud project_id', default="projectId")
69
+ parser.add_argument('--region', dest='region', type=str, help='huaweicloud region', default="region")
70
+ parser.add_argument('--group_id', dest='group_id', type=str, help='send log group_id', default="group_id")
71
+ parser.add_argument('--stream_id', dest='stream_id', type=str, help='send log stream_id', default="stream_id")
72
+ parser.add_argument('--ak', dest='ak', type=str, help='huaweicloud ak', default="ak")
73
+ parser.add_argument('--sk', dest='sk', type=str, help='huaweicloud sk', default="sk")
74
+ parser.add_argument('--consumer_count', dest='consumer_count', type=int, help='consumer count', default=1)
75
+ parser.add_argument('--consume_batch_size', dest='consume_batch_size', type=int, help='each fetch max log nums',
76
+ default=1000)
77
+ parser.add_argument('--consumer_group_name', dest='consumer_group_name', type=str, help='consumer group name',
78
+ default="consumer_group_name")
79
+ parser.add_argument('--start_time', dest='start_time', type=int, help='consume log start time ms',
80
+ default=213123123123)
81
+ parser.add_argument('--end_time', dest='end_time', type=int, help='consume log end time ms', default=0)
82
+ parser.add_argument('--log_level', dest='log_level', type=str, help='consume log end time ms', default="INFO")
83
+ parser.add_argument('--is_test', dest='is_test', type=bool, help='test consumer will write log to node',
84
+ default=True)
85
+ args = parser.parse_args()
86
+ start_consume(args.endpoint, args.region, args.project_id, args.group_id, args.stream_id, args.ak,
87
+ args.sk, args.consumer_group_name, args.start_time, args.end_time, args.log_level, args.is_test,
88
+ args.consumer_count, args.consume_batch_size)
@@ -0,0 +1,64 @@
1
+ import random
2
+ import time
3
+ from concurrent.futures import ThreadPoolExecutor
4
+
5
+ from loguru import logger
6
+
7
+ from huaweicloud_encryptionsdk._lts_sdk.producer.core.producer import Producer
8
+ from huaweicloud_encryptionsdk._lts_sdk.producer.model import lts_store
9
+ from huaweicloud_encryptionsdk._lts_sdk.producer.model.config import Config
10
+ from huaweicloud_encryptionsdk._lts_sdk.producer.utils import common
11
+
12
+
13
+ def generate_random_str(str_len=16):
14
+ """
15
+ 生成一个指定长度的随机字符串
16
+ """
17
+ random_str = ''
18
+ base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789'
19
+ length = len(base_str) - 1
20
+ for i in range(str_len):
21
+ random_str += base_str[random.randint(0, length)]
22
+ return random_str
23
+
24
+ def send_log_single_producer():
25
+ thread_num = 100
26
+ threads = []
27
+ begin_ms = common.current_time_ms()
28
+ submit_send_log_thread_pool = ThreadPoolExecutor(max_workers=thread_num, thread_name_prefix="send_log_thread")
29
+
30
+ config = Config()
31
+ config.endpoint = ""
32
+ config.access_key = ""
33
+ config.access_secret = ""
34
+ config.region_id = ""
35
+ config.project_id = ""
36
+ producer = Producer.init_producer(config)
37
+ producer.start_producer()
38
+
39
+ group_id = ""
40
+ stream_id = ""
41
+
42
+ log_content = generate_random_str(1024)
43
+ log = [log_content]
44
+ labels = {"keyA": "valueA"}
45
+ log_p = lts_store.generate_log(log, labels)
46
+
47
+ for i in range(thread_num):
48
+ new_thread = submit_send_log_thread_pool.submit(send_log_function, producer, group_id, stream_id, log_p)
49
+ threads.append(new_thread)
50
+
51
+ for t in threads:
52
+ t.result()
53
+ end_ms = common.current_time_ms()
54
+ logger.info("end send log, cost [{}]ms", end_ms - begin_ms)
55
+
56
+
57
+ def send_log_function(one_producer, group_id, stream_id, log_p):
58
+ for i in range(2000):
59
+ one_producer.send_log(group_id, stream_id, log_p)
60
+
61
+
62
+ if __name__ == '__main__':
63
+ send_log_single_producer()
64
+ time.sleep(1000)
@@ -0,0 +1,7 @@
1
+ class CallBack(object):
2
+
3
+ def invoke_on_success(self, result):
4
+ pass
5
+
6
+ def invoke_on_failed(self, result):
7
+ pass
@@ -0,0 +1,135 @@
1
+ from loguru import logger
2
+
3
+ from huaweicloud_encryptionsdk._lts_sdk.producer.model import log_batch
4
+ from huaweicloud_encryptionsdk._lts_sdk.producer.model.log import Log
5
+ from huaweicloud_encryptionsdk._lts_sdk.utils import lts_threading
6
+
7
+ DELIMITER = "|"
8
+
9
+ log_num = 0
10
+
11
+
12
+ class Accumulator(object):
13
+
14
+ def __init__(self):
15
+ self._log_batch_map = {}
16
+ self._accumulator_lock = lts_threading.ReadWriteLock()
17
+ self._config = None
18
+ self._io_worker = None
19
+ self._producer = None
20
+ self._io_thread_pool = None
21
+ self._already_send_num = 0
22
+
23
+ @staticmethod
24
+ def init_accumulator(config, io_worker, producer, thread_pool):
25
+ accumulator = Accumulator()
26
+ accumulator.config = config
27
+ accumulator.io_thread_pool = thread_pool
28
+ accumulator.io_worker = io_worker
29
+ accumulator.producer = producer
30
+ return accumulator
31
+
32
+ @property
33
+ def log_batch_map(self):
34
+ return self._log_batch_map
35
+
36
+ @property
37
+ def accumulator_lock(self):
38
+ return self._accumulator_lock
39
+
40
+ @log_batch_map.setter
41
+ def log_batch_map(self, value):
42
+ self._log_batch_map = value
43
+
44
+ @property
45
+ def config(self):
46
+ return self._config
47
+
48
+ @config.setter
49
+ def config(self, value):
50
+ self._config = value
51
+
52
+ @property
53
+ def io_worker(self):
54
+ return self._io_worker
55
+
56
+ @io_worker.setter
57
+ def io_worker(self, value):
58
+ self._io_worker = value
59
+
60
+ @property
61
+ def io_thread_pool(self):
62
+ return self._io_thread_pool
63
+
64
+ @io_thread_pool.setter
65
+ def io_thread_pool(self, value):
66
+ self._io_thread_pool = value
67
+
68
+ @property
69
+ def producer(self):
70
+ return self._producer
71
+
72
+ @producer.setter
73
+ def producer(self, value):
74
+ self._producer = value
75
+
76
+ def add_log_to_log_batch_map(self, log_data: Log, group_id: str, stream_id: str, call_back):
77
+ global log_num
78
+ try:
79
+ key = self.get_log_batch_key(group_id, stream_id)
80
+ self._accumulator_lock.acquire_write()
81
+ try:
82
+ if key in self.log_batch_map:
83
+ batch_value = self.log_batch_map.get(key)
84
+ # TODO 需要计算producer的总大小
85
+ log_size = log_data.getSize()
86
+ batch_value.add_total_data_size(log_size)
87
+ self._add_or_send_producer_batch(key, group_id, stream_id, batch_value, log_data, call_back)
88
+
89
+ else:
90
+ self._create_new_producer_log_batch(log_data, key, group_id, stream_id, call_back)
91
+
92
+ finally:
93
+ self._accumulator_lock.release_write()
94
+
95
+ return None
96
+ finally:
97
+ log_num += len(log_data.contents)
98
+ if log_num % 10000 == 0:
99
+ logger.warning("add log num {}", log_num)
100
+
101
+ def _create_new_producer_log_batch(self, log_data: Log, key: str, group_id: str, stream_id: str, call_back):
102
+ _new_batch = log_batch.init_product_batch_var_single_log(log_data, call_back, group_id, stream_id, self.config)
103
+ self.log_batch_map[key] = _new_batch
104
+
105
+ def _add_or_send_producer_batch(self, key: str, group_id: str, stream_id: str, batch_value: log_batch.LogBatch,
106
+ log: Log,
107
+ call_back):
108
+ total_data_count = batch_value.log_group_count + 1
109
+ # batch中日志大小超过MaxBatchSize && batch中日志大小< 5242880 && batch中日志条数 <= MaxBatchCount
110
+ # 直接发送
111
+ if (self.config.batch_size_threshold_in_bytes < batch_value.total_data_size < 5242880
112
+ and total_data_count <= self.config.batch_count_threshold):
113
+ batch_value.add_log_to_log_group(log)
114
+ if call_back is not None:
115
+ batch_value.add_call_back(call_back)
116
+ self._inner_send_to_server(key, batch_value)
117
+ # batch中日志大小和条数都没有满足 配置,则log加入batch中先缓存
118
+ elif (batch_value.total_data_size <= self.config.batch_size_threshold_in_bytes
119
+ and total_data_count <= self.config.batch_count_threshold):
120
+
121
+ batch_value.add_log_to_log_group(log)
122
+ if call_back is not None:
123
+ batch_value.add_call_back(call_back)
124
+
125
+ else:
126
+ self._inner_send_to_server(key, batch_value)
127
+ self._create_new_producer_log_batch(log, key, group_id, stream_id, call_back)
128
+
129
+ def _inner_send_to_server(self, key: str, batch: log_batch.LogBatch):
130
+ self.io_thread_pool.add_task(batch)
131
+ self.log_batch_map.pop(key)
132
+
133
+ @staticmethod
134
+ def get_log_batch_key(group_id: str, stream_id: str) -> str:
135
+ return group_id + DELIMITER + stream_id + DELIMITER
@@ -0,0 +1,107 @@
1
+ import queue
2
+ import threading
3
+ import time
4
+ from concurrent.futures import ThreadPoolExecutor
5
+
6
+ from loguru import logger
7
+ from huaweicloud_encryptionsdk._lts_sdk.producer.model.log_batch import LogBatch
8
+ from huaweicloud_encryptionsdk._lts_sdk.utils import lts_threading
9
+
10
+
11
+ class IOThreadPool(threading.Thread):
12
+ def __init__(self, io_worker):
13
+ super().__init__()
14
+ self._thread_pool_lock = lts_threading.ReadWriteLock()
15
+ self._deal_batch_queue = queue.Queue()
16
+ self._submit_thread_pool = ThreadPoolExecutor(max_workers=10240, thread_name_prefix="io_thread_pool_sender")
17
+ self._io_worker = io_worker
18
+
19
+ @property
20
+ def io_worker(self):
21
+ return self._io_worker
22
+
23
+ @io_worker.setter
24
+ def io_worker(self, value: int):
25
+ self._io_worker = value
26
+
27
+ @property
28
+ def thread_pool_lock(self):
29
+ return self._thread_pool_lock
30
+
31
+ @thread_pool_lock.setter
32
+ def thread_pool_lock(self, value: int):
33
+ self._thread_pool_lock = value
34
+
35
+ @property
36
+ def deal_batch_queue(self):
37
+ self._thread_pool_lock.acquire_read()
38
+ try:
39
+ return self._deal_batch_queue
40
+ finally:
41
+ self._thread_pool_lock.release_read()
42
+
43
+ @deal_batch_queue.setter
44
+ def deal_batch_queue(self, value: int):
45
+ self._thread_pool_lock.acquire_write()
46
+ try:
47
+ self._deal_batch_queue = value
48
+ finally:
49
+ self._thread_pool_lock.release_write()
50
+
51
+ def add_task(self, batch: LogBatch):
52
+
53
+ self._thread_pool_lock.acquire_write()
54
+ try:
55
+ self._deal_batch_queue.put_nowait(batch)
56
+ except queue.Full as e:
57
+ logger.error("log batch queue is full, log generate is too fast")
58
+ finally:
59
+ self._thread_pool_lock.release_write()
60
+
61
+ def take_task(self):
62
+ self._thread_pool_lock.acquire_read()
63
+ try:
64
+ if self._deal_batch_queue is None or self._deal_batch_queue.empty():
65
+ return None
66
+ batch = self._deal_batch_queue.get_nowait()
67
+ return batch
68
+ finally:
69
+ self._thread_pool_lock.release_read()
70
+
71
+ def has_task(self):
72
+ self._thread_pool_lock.acquire_read()
73
+ try:
74
+ if self._deal_batch_queue is None:
75
+ return False
76
+ return not self._deal_batch_queue.empty()
77
+ finally:
78
+ self._thread_pool_lock.release_read()
79
+
80
+ def task_queue_size(self):
81
+ self._thread_pool_lock.acquire_read()
82
+ try:
83
+ if self._deal_batch_queue is None:
84
+ return 0
85
+ return self._deal_batch_queue.qsize()
86
+ finally:
87
+ self._thread_pool_lock.release_read()
88
+
89
+ def run(self):
90
+ try:
91
+ while True:
92
+ batch = self.take_task()
93
+ if batch is None:
94
+ time.sleep(0.1)
95
+ else:
96
+ self.io_worker.start_this_send_task()
97
+
98
+ def send_to_server_handler(io_worker, log_batch):
99
+ try:
100
+ io_worker.io_worker_send_to_server(log_batch)
101
+ finally:
102
+ io_worker.end_this_send_task()
103
+
104
+ self._submit_thread_pool.submit(send_to_server_handler, self.io_worker, batch)
105
+
106
+ finally:
107
+ self.io_worker.dec_task_count()
@@ -0,0 +1,124 @@
1
+ import math
2
+ import queue
3
+ import threading
4
+
5
+ from huaweicloud_encryptionsdk._lts_sdk.producer.lts_http import http_client
6
+ from huaweicloud_encryptionsdk._lts_sdk.producer.model import log_batch
7
+ from huaweicloud_encryptionsdk._lts_sdk.producer.model import result
8
+ from huaweicloud_encryptionsdk._lts_sdk.producer.model.error import Error
9
+ from huaweicloud_encryptionsdk._lts_sdk.utils import lts_threading, common
10
+
11
+
12
+ class IOWorker(threading.Thread):
13
+ def __init__(self, max_io_worker_count, no_retry_code, producer):
14
+ super().__init__()
15
+ self._task_count_lock = lts_threading.ReadWriteLock()
16
+ self._task_count = 0
17
+ # 控制io_worker数量,超过限制时,后面的都进行等待,等待前面io_worker处理完
18
+ self._max_io_worker = queue.Queue(max_io_worker_count)
19
+ self._no_retry_status_code = no_retry_code
20
+ self._producer = producer
21
+ self._retry_queue_lock = lts_threading.ReadWriteLock()
22
+ self._retry_queue = queue.Queue()
23
+ self._lock = threading.Lock()
24
+ self._client = http_client.HttpClient()
25
+
26
+ @property
27
+ def producer(self):
28
+ return self._producer
29
+
30
+ @producer.setter
31
+ def producer(self, value):
32
+ self._producer = value
33
+
34
+ @property
35
+ def task_count(self):
36
+ self._task_count_lock.acquire_read()
37
+ try:
38
+ return self._task_count
39
+ finally:
40
+ self._task_count_lock.release_read()
41
+
42
+ @task_count.setter
43
+ def task_count(self, value):
44
+ self._task_count_lock.acquire_write()
45
+ try:
46
+ self._task_count = value
47
+ finally:
48
+ self._task_count_lock.release_write()
49
+
50
+ def io_worker_send_to_server(self, batch: log_batch.LogBatch):
51
+ begin_time = common.current_time_ms()
52
+ # TODO 此处进行日志发送
53
+ err = self._client.put_logs(batch.group_id, batch.stream_id, batch.log_group, self._producer.producer_config)
54
+ if err is None:
55
+ if batch.attempt_count < self._producer.producer_config.max_reserved_attempts:
56
+ now_time = common.current_time_ms()
57
+ attempt = result.Attempt(True, 200, "", "", "", now_time, now_time - begin_time)
58
+ batch.add_attempt(attempt)
59
+ batch.result.success = True
60
+ if len(batch.call_back_list) > 0:
61
+ for call_back in batch.call_back_list:
62
+ call_back.invoke_on_success(batch.result)
63
+
64
+ else:
65
+ if err.http_code in self._no_retry_status_code:
66
+ self.add_error_msg_to_batch_attempt(batch, err, False, begin_time)
67
+ self.exec_failed_call_back(batch)
68
+ return
69
+
70
+ if batch.attempt_count < self._producer.producer_config.retries:
71
+ self.add_error_msg_to_batch_attempt(batch, err, True, begin_time)
72
+ retry_wait_time = self._producer.producer_config.base_retry_backoff_ms * math.pow(2,
73
+ batch.attempt_count - 1)
74
+ if retry_wait_time < self.producer.producer_config.max_retry_backoff_ms:
75
+ batch.next_retry_ms = common.current_time_ms() + retry_wait_time
76
+ else:
77
+ batch.next_retry_ms = common.current_time_ms() + self.producer.producer_config.max_retry_backoff_ms
78
+ self.send_to_retry_queue(batch)
79
+ else:
80
+ self.exec_failed_call_back(batch)
81
+
82
+ def end_this_send_task(self):
83
+ self._max_io_worker.get()
84
+ self.dec_task_count()
85
+
86
+ def start_this_send_task(self):
87
+ self.inc_task_count()
88
+ self._max_io_worker.put(1)
89
+
90
+ def inc_task_count(self):
91
+ self._task_count_lock.acquire_write()
92
+ try:
93
+ self._task_count += 1
94
+ finally:
95
+ self._task_count_lock.release_write()
96
+
97
+ def dec_task_count(self):
98
+ self._task_count_lock.acquire_write()
99
+ try:
100
+ self._task_count -= 1
101
+ finally:
102
+ self._task_count_lock.release_write()
103
+
104
+ def send_to_retry_queue(self, batch: log_batch.LogBatch):
105
+ self._retry_queue_lock.acquire_write()
106
+ try:
107
+ self._retry_queue.put_nowait(batch)
108
+ finally:
109
+ self._retry_queue_lock.release_write()
110
+
111
+ def add_error_msg_to_batch_attempt(self, batch: log_batch.LogBatch, err: Error, retry: bool, begin_ms: int):
112
+ if batch.attempt_count < self.producer.producer_config.max_reserved_attempts:
113
+ now_ms = common.current_time_ms()
114
+ attempt = result.Attempt(False, err.http_code, err.request_id, err.error_code, err.error_msg, now_ms,
115
+ now_ms - begin_ms)
116
+ batch.add_attempt(attempt)
117
+ batch.result.success = False
118
+ batch.attempt_count += 1
119
+
120
+ @classmethod
121
+ def exec_failed_call_back(cls, batch: log_batch.LogBatch):
122
+ if len(batch.call_back_list) > 0:
123
+ for call_back in batch.call_back_list:
124
+ call_back.invoke_on_failed(batch.result)